From 3f122784a35b5a60fac3e946d1a99941b3f116c9 Mon Sep 17 00:00:00 2001 From: Mark Dickinson Date: Thu, 11 Dec 2008 09:06:49 +0000 Subject: Issue #4084: fix bug in handling of NaNs in Decimal.max, Decimal.min, Decimal.max_mag and Decimal.min_mag. --- Lib/decimal.py | 32 ++++++++++++++++---------------- Lib/test/decimaltestdata/extra.decTest | 17 +++++++++++++++++ Misc/NEWS | 4 ++++ 3 files changed, 37 insertions(+), 16 deletions(-) diff --git a/Lib/decimal.py b/Lib/decimal.py index 591f4de..b5a9435 100644 --- a/Lib/decimal.py +++ b/Lib/decimal.py @@ -2430,10 +2430,10 @@ class Decimal(object): sn = self._isnan() on = other._isnan() if sn or on: - if on == 1 and sn != 2: - return self._fix_nan(context) - if sn == 1 and on != 2: - return other._fix_nan(context) + if on == 1 and sn == 0: + return self._fix(context) + if sn == 1 and on == 0: + return other._fix(context) return self._check_nans(other, context) c = self.__cmp__(other) @@ -2472,10 +2472,10 @@ class Decimal(object): sn = self._isnan() on = other._isnan() if sn or on: - if on == 1 and sn != 2: - return self._fix_nan(context) - if sn == 1 and on != 2: - return other._fix_nan(context) + if on == 1 and sn == 0: + return self._fix(context) + if sn == 1 and on == 0: + return other._fix(context) return self._check_nans(other, context) c = self.__cmp__(other) @@ -3043,10 +3043,10 @@ class Decimal(object): sn = self._isnan() on = other._isnan() if sn or on: - if on == 1 and sn != 2: - return self._fix_nan(context) - if sn == 1 and on != 2: - return other._fix_nan(context) + if on == 1 and sn == 0: + return self._fix(context) + if sn == 1 and on == 0: + return other._fix(context) return self._check_nans(other, context) c = self.copy_abs().__cmp__(other.copy_abs()) @@ -3073,10 +3073,10 @@ class Decimal(object): sn = self._isnan() on = other._isnan() if sn or on: - if on == 1 and sn != 2: - return self._fix_nan(context) - if sn == 1 and on != 2: - return other._fix_nan(context) + if on == 1 and sn == 0: + return self._fix(context) + if sn == 1 and on == 0: + return other._fix(context) return self._check_nans(other, context) c = self.copy_abs().__cmp__(other.copy_abs()) diff --git a/Lib/test/decimaltestdata/extra.decTest b/Lib/test/decimaltestdata/extra.decTest index 0cc1bbb..2e3fce8 100644 --- a/Lib/test/decimaltestdata/extra.decTest +++ b/Lib/test/decimaltestdata/extra.decTest @@ -154,6 +154,23 @@ extr1301 fma Inf 0 sNaN456 -> NaN Invalid_operation extr1302 fma 0E123 -Inf sNaN789 -> NaN Invalid_operation extr1302 fma -Inf 0E-456 sNaN148 -> NaN Invalid_operation +-- max/min/max_mag/min_mag bug in 2.5.2/2.6/3.0: max(NaN, finite) gave +-- incorrect answers when the finite number required rounding; similarly +-- for the other thre functions +maxexponent: 999 +minexponent: -999 +precision: 6 +rounding: half_even +extr1400 max NaN 1234567 -> 1.23457E+6 Inexact Rounded +extr1401 max 3141590E-123 NaN1729 -> 3.14159E-117 Rounded +extr1402 max -7.654321 -NaN -> -7.65432 Inexact Rounded +extr1410 min -NaN -765432.1 -> -765432 Inexact Rounded +extr1411 min 3141592 NaN -> 3.14159E+6 Inexact Rounded +extr1420 max_mag 0.1111111 -NaN123 -> 0.111111 Inexact Rounded +extr1421 max_mag NaN999999999 0.001234567 -> 0.00123457 Inexact Rounded +extr1430 min_mag 9181716151 -NaN -> 9.18172E+9 Inexact Rounded +extr1431 min_mag NaN4 1.818180E100 -> 1.81818E+100 Rounded + -- Tests for the is_* boolean operations precision: 9 maxExponent: 999 diff --git a/Misc/NEWS b/Misc/NEWS index 518f355..6b7aa3a 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -107,6 +107,10 @@ Core and builtins Library ------- +- Issue #4084: Fix max, min, max_mag and min_mag Decimal methods to + give correct results in the case where one argument is a quiet NaN + and the other is a finite number that requires rounding. + - Issue #1776581 and #4302. Minor corrections to smtplib. - Issue #3774: Fixed an error when create a Tkinter menu item without command -- cgit v0.12