Steve Willoughby wrote:
On 06-Feb-12 07:25, Kapil Shukla wrote:
i tried writing a small code to calculate option price using the
binomial tree model. I compared my results with results of the same
program in excel. There seems to be a minor difference due to decimal
precision as excel is using 15 decimal precision and python (both 2.7
and 3.1) using 11. (at least that's what shown on shell)

If you need lots of precision, you might consider using the decimal class. It'll cost you speed vs. the native floating-point type but won't cause you round-off errors.

I'm afraid that's not correct. Decimal is still subject to rounding errors.

>>> from decimal import Decimal
>>> x = 1/Decimal(3)  # one third, as close as a Decimal can give
>>> x + x + x == 1
False


The difference is that the rounding errors you get with Decimal are usually different to the ones you get with binary floats. For example:

>>> y = 0.1  # one tenth, as close as a binary float can give
>>> y+y + y+y + y+y + y+y + y+y == 1
False

while the same calculation is exact with Decimal.

The reason for the error is the same in both cases: in the first, 1/3 takes an infinite number of decimal digits, while in the second, 1/10 takes an infinite number of binary digits. So Decimal 1/3 is not *precisely* 1/3, and float 1/10 is not precisely 1/10 either.

Binary floats can store exactly any fraction which can be written as a sum of powers of 1/2, e.g.:

0.40625 = 13/32 = 1/4 + 1/8 + 1/32 so can be stored exactly in a float

Every other number is rounded. The same applies to Decimal: it can store exactly any fraction which can be written as a sum of powers of 1/10.

The advantage of Decimal is that anything which can be stored as an exact float can also be stored as an exact Decimal, plus some numbers which can't be written as exact floats. But there are still plenty of numbers which can't be stored exactly as either.



--
Steven

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

Reply via email to