Prevent Rounding to Zero in Python

math, pi, python, rounding

Solution

Try:

s = Decimal((13591409+545140134*k)) / Decimal(((640320**3)**k))

The arithmetic you're doing is native python - by allowing the Decimal object to perform your division, you should eliminate your error.

You can do the same, then, when computing `r`.

Problem

I have a program meant to approximate pi using the Chudnovsky Algorithm, but a term in my equation that is very small keeps being rounded to zero. Here is the algorithm: ``` import math from decimal import * getcontext().prec = 100 pi = Decimal(0.0) C = Decimal(12/(math.sqrt(640320**3))) k = 0 x = Decimal(0.0) result = Decimal(0.0) sign = 1 while k<10: r = Decimal(math.factorial(6*k)/((math.factorial(k)**3)*math.factorial(3*k))) s = Decimal((13591409+545140134*k)/((640320**3)**k)) x += Decimal(sign*r*s) sign = sign*(-1) k += 1 result = Decimal(C*x) pi = Decimal(1/result) print Decimal(pi) ``` The equations may be clearer without the "decimal" terms. ``` import math pi = 0.0 C = 12/(math.sqrt(640320**3)) k = 0 x = 0.0 result = 0.0 sign = 1 while k<10: r = math.factorial(6*k)/((math.factorial(k)**3)*math.factorial(3*k)) s = (13591409+545140134*k)/((640320**3)**k) x += sign*r*s sign = sign*(-1) k += 1 result = C*x pi = 1/result print pi ``` The issue is with the "s" variable. For k>0, it always comes to zero. e.g. at k=1, s should equal about 2.1e-9, but instead it is just zero. Because of this all of my terms after the first =0. How do I get python to calculate the exact value of s instead of rounding it down to 0?

Original source