Am 18.11.2010 17:27, schrieb Daniel Fetchinson:
I do a recursive evaluation of an expression involving fractions and
unsurprisingly the numerator and denominator grows pretty quickly.
After 10-20 iterations the number of digits in the numerator and
denominator (as integers) reaches 80-100. And I'm wondering until what
point I can trust the result since I'm using fractions.Fraction for
the whole procedure. Are Fraction's infinite precision? Or will I get
some sort of an exception if python is not able to represent the
numerator and/or denominator as integers?

http://www.python.org/dev/peps/pep-3141/ was not very helpful in this
regard nor was http://docs.python.org/library/fractions.html

Any ideas?

Cheers,
Daniel

I'm not sure what you really want to know.
Fractions are, by their math definition, of unlimited precision.
For example, PI/2 is accurate (with endless precision as PI is a trancendent number),
but 3.1415926/2 (the decimal representation) is not.
So is fraction.Fraction(1,3) of unlimited precision, thus giving this:

from fractions import Fraction
>>> one_tenth=Fraction(1,10)
>>> a =  one_tenth+one_tenth
>>> a
Fraction(1, 5)
>>> a =  one_tenth+one_tenth+one_tenth
>>> a
Fraction(3, 10)

now compare to standard floats:
>>> one_tenth=1.0/10
>>> a =  one_tenth+one_tenth
>>> a
0.2
>>> a =  one_tenth+one_tenth+one_tenth
>>> a
0.30000000000000004
(this error is caused by the internal representation of floats as binary numbers, see No. 14 in Python tut).


I think you really want to know, how large numerator/denominator can be.
As python has bignum support (type=long), the only limit is the one your virtual memory system
offers, which is almost always approx. the amount of ram.

If you need it really *precise*, cast your Fractions into type Decimal:

>>> from decimal import Decimal
>>> one_tenth=Fraction(1,10)
>>> three_tenth = one_tenth*3
>>> d = Decimal(three_tenth.numerator)/Decimal(three_tenth.denominator)
>>> d
Decimal('0.3')

The operator '/' (__div__) is properly over-written.

You can even tweak the precision getcontext().prec by setting it to a higher value.

Cheers

<<attachment: stefan_sonnenberg.vcf>>

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to