[issue11128] decimal.py: to_integral() corner cases

2011-02-07 Thread Stefan Krah

Stefan Krah stefan-use...@bytereef.org added the comment:

For the record, I prefer Python's behavior. The quantize() definition
does not work well for arbitrary precision input and leads to situations
like:


Precision: 1
Maxexponent: 1
Minexponent: -1

tointegral  101  -  101
tointegral  101.0  -  NaN  Invalid_operation


A comment in tointegral.decTest suggests that the to-integral definition 
was modeled after IEEE 854 and 754r:

-- This set of tests tests the extended specification 'round-to-integral
-- value' operation (from IEEE 854, later modified in 754r).
-- All non-zero results are defined as being those from either copy or
-- quantize, so those are assumed to have been tested.
-- Note that 754r requires that Inexact not be set, and we similarly
-- assume Rounded is not set.


This definition of course works fine as long as the input does not
have more than 'precision' digits and Emax is sufficiently large. I
think that for arbitrary precision input the definition should read:


Otherwise (the operand has a negative exponent) the result is the
 same as using the quantize operation using the given operand as the
 left-hand-operand and 1E+0 as the right-hand-operand. For the purpose
 of quantizing a temporary context is used with the precision of the
 operand as the precision setting, Emax = prec and Emin = -Emax. The
 rounding mode is taken from the context, as usual.

--

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue11128
___
___
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue11128] decimal.py: to_integral() corner cases

2011-02-05 Thread Stefan Krah

New submission from Stefan Krah stefan-use...@bytereef.org:

Hi,

to_integral() should behave like quantize() for negative exponents:

Otherwise (the operand has a negative exponent) the result is the
 same as using the quantize operation using the given operand as the
 left-hand-operand, 1E+0 as the right-hand-operand, and the precision
 of the operand as the precision setting. The rounding mode is taken
 from the context, as usual.


There are some corner cases where this matters:


 from decimal import *
 c = Context(prec=1, Emin=-1, Emax=1, traps=[])
 d = Context(prec=4, Emin=-1, Emax=1, traps=[])
 
 c.to_integral(Decimal(999.9))
Decimal('1000')
 d.quantize(Decimal(999.9), Decimal(1e0))
Decimal('NaN')


Indeed, decNumber returns NaN for to_integral(). This is an odd
situation, since for the result it is possible to exceed the
precision but not Emax:


 c = Context(prec=3, Emin=-3, Emax=3, traps=[])
 d = Context(prec=4, Emin=-3, Emax=3, traps=[])
 c.to_integral(Decimal(999.9))
Decimal('1000')
 d.quantize(Decimal(999.9), Decimal(1e0))
Decimal('1000')


The specification is on the side of decNumber, but I wonder if this is
an oversight.

--
components: Library (Lib)
messages: 127986
nosy: mark.dickinson, skrah
priority: normal
severity: normal
status: open
title: decimal.py: to_integral() corner cases
type: behavior
versions: Python 3.3

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue11128
___
___
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com