[Patches] [ python-Patches-1741308 ] Fix Decimal.sqrt bugs described in #1725899

SourceForge.net noreply at sourceforge.net
Mon Jul 2 16:34:40 CEST 2007


Patches item #1741308, was opened at 2007-06-22 06:54
Message generated for change (Comment added) made by marketdickinson
You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=305470&aid=1741308&group_id=5470

Please note that this message will contain a full copy of the comment thread,
including the initial issue submission, for this request,
not just the latest update.
Category: Library (Lib)
Group: Python 2.6
Status: Open
Resolution: None
Priority: 5
Private: No
Submitted By: Mark Dickinson (marketdickinson)
Assigned to: Facundo Batista (facundobatista)
Summary: Fix Decimal.sqrt bugs described in #1725899

Initial Comment:
This patch fixes a number of (yet-to-be-confirmed-as-) bugs in Decimal.sqrt();  see bug report 1725899 for details of these.

As a side benefit the modified version of Decimal.sqrt() runs significantly faster than the original, since it's based on integer arithmetic instead of carrying out Newton's method entirely in decimal;  on my iBook G4 the speedup is between 20 and 25 times with the default precision.

----------------------------------------------------------------------

>Comment By: Mark Dickinson (marketdickinson)
Date: 2007-07-02 14:34

Message:
Logged In: YES 
user_id=703403
Originator: YES

File Added: decimal_sqrt_2.patch

----------------------------------------------------------------------

Comment By: Mark Dickinson (marketdickinson)
Date: 2007-07-02 14:33

Message:
Logged In: YES 
user_id=703403
Originator: YES

Here's an updated patch, with:
 -- several hundred extra testcases, in a new file
squareroot_extra.decTest
 -- fixes for two bugs in the previous patch; one where the context
rounding mode was occasionally used instead of ROUND-HALF-EVEN, and one
involving underflow to 0.
 -- a fix for the following problem in Decimal._fixexponents():  (should I
submit a separate patch for this instead?)

>>> from decimal import *
>>> getcontext().Emax = 9
>>> getcontext().Emin = -9
>>> getcontext()._clamp = 1
>>> +Decimal("1E10")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/local/lib/python2.5/decimal.py", line 935, in __pos__
    ans = self._fix(context)
  File "/opt/local/lib/python2.5/decimal.py", line 1530, in _fix
    ans = self._fixexponents(context)
  File "/opt/local/lib/python2.5/decimal.py", line 1565, in _fixexponents
    ans = ans._rescale(Etop, context=context)
  File "/opt/local/lib/python2.5/decimal.py", line 1913, in _rescale
    return context._raise_error(InvalidOperation, 'Rescale > prec')
  File "/opt/local/lib/python2.5/decimal.py", line 2325, in _raise_error
    raise error, explanation
decimal.InvalidOperation: Rescale > prec

I've been in contact with Cowlishaw;  he's agreed that it looks as though
the C reference implementation needs a few changes, but hasn't had a chance
to look at things properly yet;  I've sent him the extra testcases above as
well.  Please let me know if there's anything else I can do to help.

Mark

----------------------------------------------------------------------

Comment By: Facundo Batista (facundobatista)
Date: 2007-06-22 12:29

Message:
Logged In: YES 
user_id=752496
Originator: NO

Yes, I'll handle this and the mentioned bug. Thanks.

----------------------------------------------------------------------

Comment By: Neal Norwitz (nnorwitz)
Date: 2007-06-22 07:09

Message:
Logged In: YES 
user_id=33168
Originator: NO

Facundo, could you take a look?

----------------------------------------------------------------------

You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=305470&aid=1741308&group_id=5470


More information about the Patches mailing list