问题
I'm trying to implement the Chudnovsky algorithm for calculating pi. I am using formulas from this description https://www.craig-wood.com/nick/articles/pi-chudnovsky/
Now it's working, but maximum number of digits it can show is 3.141592653589793238462643385 - only 27 digits.
Why does Python limits the number of digits in this script? May be i am using Decimal in wrong way?
Here is my code (updated):
from decimal import Decimal, getcontext
from math import factorial
import sys
def calculate_pi(max_K, number_of_digits):
getcontext.prec = number_of_digits+2
a_k, b_k, C, a_sum, b_sum = 1, 0, 640320, 1, 0
for k in range(1,max_K):
a_k *= -(Decimal(24)/Decimal(C**3))*Decimal((6*k-5)*(2*k-1)*(6*k-1))/Decimal(k**3)
a_sum += a_k
b_sum += a_k*k
pi = 426880*Decimal(10005).sqrt()/Decimal(13591409*a_sum + 545140134*b_sum)
print str(pi)[:number_of_digits+2]
def main(number_of_digits):
pi = calculate_pi(10000, number_of_digits)
if __name__ == "__main__":
number_of_digits = int(sys.argv[1])
main(number_of_digits)
回答1:
First of, this site is not a bug-searching site. However I was interested in the problem, and checked out the site you mentioned.
If you look at the definition of a
, then you see that the first summand is 1
, and not -6*5*4/640320^3
.
Also since you start your loop at k = 1
, you additionally need to assign the variables a_sum
and b_sum
with the first summands a_0 = 1
and b_0 = 0
.
回答2:
Use getcontext().prec = ...
instead of getcontext.prec = ...
来源:https://stackoverflow.com/questions/50906200/the-chudnovsky-formula-in-python