[Tutor] puzzled again by decimal module

Dick Moores rdm at rcblue.com
Sat Aug 19 01:10:21 CEST 2006


At 02:41 PM 8/18/2006, Bob Gailer wrote:
>Dick Moores wrote:
>>As an exercise that I thought would help me understand the decimal 
>>module, I've been trying write a script (precisionFactorial.py) 
>>that uses a modified fact(n) to compute precise factorials
>What do you mean by "precise factorials"? Python's long integer 
>should handle this just fine.

Well, actually, my old fact(100) produces 
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
Not exactly correct.

>>[snip]
>>
>
>># precisionFactorial.py
>>
>>import decimal
>>
>>def d(x):
>>      return decimal.Decimal(str(x))
>>
>>def fact(n):
>>      product = 1
>>      while d(n) > 1:
>>          product *= n
>>          d(n) -= 1
>d(n) -= 1 is shorthand for d(n) = d(n) - 1. This will fail, since 
>d(n) is a function call, which is not valid as as assignment target. 
>Instead you should should:
>
>def fact(n):
>     product = 1
>     dec_n = d(n)
>     while dec_n > 1:
>         product *= n
>         dec_n -= 1     return product

Ah, a notation problem. Thanks!

But here's the revised precisionFactorial.py:

========================
# 1precisionFactorial.py

import decimal

def d(x):
     return decimal.Decimal(str(x))

def fact(n):
     product = 1
     dec_n = d(n)
     while dec_n > 1:
         product *= dec_n
         dec_n -= 1
     return product

n = 100
decimal.getcontext().prec = 200
print fact(n)
================================================

93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

Still not exactly correct! I'm bewildered.

Dick



More information about the Tutor mailing list