From 263a6ca1146f9b1e674c8f15f28e9c363993d194 Mon Sep 17 00:00:00 2001 From: Marc Mezzarobba Date: Wed, 16 Sep 2015 14:45:15 +0200 Subject: [PATCH] RealInterval: fix min/max(..., NaN, ...) --- src/sage/rings/real_mpfi.pyx | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/sage/rings/real_mpfi.pyx b/src/sage/rings/real_mpfi.pyx index c5e7ee6aa0e..c8f1d333566 100644 --- a/src/sage/rings/real_mpfi.pyx +++ b/src/sage/rings/real_mpfi.pyx @@ -3907,6 +3907,16 @@ cdef class RealIntervalFieldElement(sage.structure.element.RingElement): sage: min(RIF(-1, 1), RIF(-100, 100)).endpoints() (-1.00000000000000, 1.00000000000000) + Note that calls involving NaNs try to return a number when possible. + This is consistent with IEEE-754-2008 but may be surprising. :: + + sage: RIF('nan').min(2, 1) + 1 + sage: RIF(-1/3).min(RIF('nan')) + -0.3333333333333334? + sage: RIF('nan').min(RIF('nan')) + [.. NaN ..] + .. SEEALSO:: :meth:`~sage.rings.real_mpfi.RealIntervalFieldElement.max` @@ -3932,7 +3942,11 @@ cdef class RealIntervalFieldElement(sage.structure.element.RingElement): else: other = self._parent(_other) - if mpfr_cmp(&result.value.right, &other.value.left) <= 0: + if result.is_NaN(): + result = other + elif other.is_NaN(): + pass + elif mpfr_cmp(&result.value.right, &other.value.left) <= 0: pass elif mpfr_cmp(&other.value.right, &result.value.left) <= 0: result = other @@ -3997,6 +4011,16 @@ cdef class RealIntervalFieldElement(sage.structure.element.RingElement): sage: max(RIF(-1, 1), RIF(-100, 100)).endpoints() (-1.00000000000000, 1.00000000000000) + Note that calls involving NaNs try to return a number when possible. + This is consistent with IEEE-754-2008 but may be surprising. :: + + sage: RIF('nan').max(1, 2) + 2 + sage: RIF(-1/3).max(RIF('nan')) + -0.3333333333333334? + sage: RIF('nan').max(RIF('nan')) + [.. NaN ..] + .. SEEALSO:: :meth:`~sage.rings.real_mpfi.RealIntervalFieldElement.min` @@ -4022,7 +4046,11 @@ cdef class RealIntervalFieldElement(sage.structure.element.RingElement): else: other = self._parent(_other) - if mpfr_cmp(&result.value.right, &other.value.left) <= 0: + if result.is_NaN(): + result = other + elif other.is_NaN(): + pass + elif mpfr_cmp(&result.value.right, &other.value.left) <= 0: result = other elif mpfr_cmp(&other.value.right, &result.value.left) <= 0: pass