Setting longer default decimal precision

Steven D'Aprano steve+comp.lang.python at pearwood.info
Wed Nov 20 15:02:20 CET 2013


Hi Kay,

You emailed me off-list, but your email address is bouncing or invalid, 
so I have no way to email you back.

Unless you have something private or personal to say, you should keep 
replies on the list here so that others can either answer your questions 
or learn from the responses. If you do have something private to say, you 
should use a real email address that accepts replies :-)

I'm taking the liberty of republishing your comments to me here:

[you wrote]
Okay,but after I import "math" and "decimal",

py> decimal.getcontext().prec=75
py> print decimal.Decimal(math.atan(1))
0.78539816339744827899949086713604629039764404296875

though I set precision to 75, it only did the trig function to 50
places AND it is only right to 16 places,

0.785398163397448309615660845819875721049292349843776...(actual).
[end quote]


Here, you calculate the atan of 1 using floating point maths, that is, to 
the precision of C doubles (about 17 decimal places). After the 
calculation is performed using float, you then convert it to a Decimal, 
but it is too late, you can't retroactively regain precision.

In a perfect world, this would work:

math.atan(Decimal(1))

but alas, all the functions in the math module convert their arguments to 
float first, so even though your Decimal(1) could perform calculations to 
75 decimal places, the math.atan function downgrades it to a regular 
float.

Unfortunately, Decimals don't support high-precision trig functions. If 
you study the decimal.py module, you could possibly work out how to add 
support for trig functions, but they have no current support for them.

You could try this third-party module:

http://code.google.com/p/mpmath/‎

which claims to be arbitrary-precision maths for Python, but I've never 
used it.


-- 
Steven



More information about the Python-list mailing list