On Mon, Jan 31, 2011 at 01:32, Steven D'Aprano <st...@pearwood.info> wrote:
> Richard D. Moores wrote:
>>
>> Python 3.1
>> The decimal module continues to puzzle me from time to time. Here's
>> one of those. I want to use Alex Martelli's factory function as much
>> as possible. Turns out it has a problem with precision in addition and
>> multiplication.
>>
>> =========================================
>> from decimal import Decimal as D
>> import decimal
>>
>> #Alex Martelli's factory function from 'Python in a Nutshell', 2nd ed.,
>> p.373
>> def d(x):
>>    return decimal.Decimal(str(x))
>
>
> I don't have the second edition of the book, only the first. Are you sure
> that Alex Martelli calls this a *factory* function? It doesn't look like a
> factory to me.

Quoting from p. 373, just before the function d():
"... you can easily write a factory function for ease of
experimentation, with decimal:"

(But I should confess that I have only a very foggy idea what a
factory function is.)

>> decimal.getcontext().prec = 55
>>
>> print('power')
>> a = D('123.2345274523452345235432452345')**D('2.3')
>> a2 = d(123.2345274523452345235432452345)**d(2.3)
>> print('a =', a)
>> print('a2 =', a2)
>> print()
>
> And here is your problem:
>
>>>> str(123.2345274523452345235432452345)
> '123.234527452'
>
> Consequently:
>
>>>> D(str(123.2345274523452345235432452345))
> Decimal('123.234527452')
>
>
>> Why in the world does precision not work for addition and
>> multiplication (see x2 and z2)?
>
> It does. You are misinterpreting the error. The problem is not with the
> addition, but with the construction *before* the addition.

But the same construction, d(), is used for power and division, and
the precision of the outputs is correct. Or have I misunderstood you?
For your reference, here's the script (with output) I originally
posted about:
<http://tutoree7.pastebin.com/Chcb80HC>

> By the way, if you are using Python 2.7 or 3.1, you should consider using
> the Decimal.from_float method.

Ah, that solves my problem. See
<http://tutoree7.pastebin.com/Rt4xhtA2>.  Thanks!

the precision is correct for all 4 cases. Not only that, but
a, x, y, z equal a2, x2, y2, z2 , respectively.

But a new (minor) question has arisen with Decimal.from_float. How
could I abbreviate that to, say, D, when I don't want to use d()?
>>> from decimal import Decimal.from_float as D
Traceback (most recent call last):
  File "<string>", line 1, in <fragment>
Syntax Error: from decimal import Decimal.from_float as D: <string>, line 128

Write a function, I suppose?

import decimal
def D(x):
    return decimal.Decimal.from_float(x)

decimal.getcontext().prec = 80
x = 34.56
y = 54

a = D(x)**D(y)
print(a)

"""
OUTPUT
1.2105469158150833527405908484753780279256714499986841719510192301537218650731014E+83
"""


Dick
_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to