extend methods of decimal module
Wolfgang Maier
wolfgang.maier at biologie.uni-freiburg.de
Fri Feb 28 09:41:49 EST 2014
Mark H. Harris <harrismh777 <at> gmail.com> writes:
>
> If you get a chance, take a look at the dmath.py code on:
>
> https://code.google.com/p/pythondecimallibrary/
>
Hi Mark,
here is an enhancement for your epx function.
Your current version comes with the disadvantage of potentially storing
extremely large values in n and d because of the multiplications in the
while loop:
q = D(x)
n = q
c = D(1)
d = D(1)
ex = 1 + q
prev_ex = D(0)
while (ex != prev_ex):
prev_ex = ex
c += 1
d *= c # can become a huge number
n *= q # this as well
ex += n/d
in general, large numbers are handled well by the Decimal class, but there
is a certain burden on these calculations and with VERY large numbers you
can also get a decimal.Overflow:
>>> exp(200000)
Traceback (most recent call last):
File "<pyshell#46>", line 1, in <module>
epx(190000)
File "C:\Python34\dmath_rev.py", line 27, in epx
n *= q
decimal.Overflow: [<class 'decimal.Overflow'>]
My re-write of the part above is:
q = D(x)
c = 1
new_element = q
ex = 1 + new_element
prev_ex = D(0)
while (ex != prev_ex):
prev_ex = ex
c += 1
# every new element in the series is a known fraction of the
# previous element,
# so there is no need to store large numbers
new_element *= q/c
ex += new_element
in my hands, this simple change increases performance (exact timing left to
you) and boost the range of possible calculations:
>>> epx2(1000000)
Decimal('3.033215396802087545086402141E+434294')
Cheers,
Wolfgang
More information about the Python-list
mailing list