我编写了一个Python程序,使用十进制数据类型在小数点后第n位打印pi。我使用的算法是Bailey-Borwein-Plouffe formula。
该程序最多可以打印1076位数字,并且无论给定的精度极限是多少,都将停止打印。
from decimal import *
def nthdigit(n):
final = 0
for k in range(0,n):
calc =Decimal((16**-k)*(4/(8*k+1) - 2/(8*k+4) - 1/(8*k+5) - 1/(8*k+6)))
#THE BAILEY-BORWEIN-PLOUFFE FORMULA
final = Decimal(final+calc)
print(final)
n=100000
n=n+1
getcontext().prec = n
nthdigit(n)
我想知道它是否是Decimal
数据类型中的默认设置,如果可以的话,是否有办法超越该精度限制?
答案 0 :(得分:1)
您没有使用Decimal进行计算。您正在使用float,然后将生成的float转换为Decimal。
您无需将所有数字显式转换为十进制,但是在计算的最内部部分至少必须有一个数字为十进制。当您尝试对Decimal和非Decimal进行算术运算时,Decimal类将根据需要转换其他数字。为了确保不会出现浮点错误,请勿混用浮点数和小数,仅应将小数彼此或与整数组合。
这是程序的修复版本。
from decimal import Decimal, getcontext
def nthdigit(n):
final = 0
for k in range(n):
k = Decimal(k)
# The Bailey-Borwein-Plouffe Formula
calc = (4/(8*k+1) - 2/(8*k+4) - 1/(8*k+5) - 1/(8*k+6)) / (16**k)
final += calc
return final
n = 1000
n += 1
getcontext().prec = n
print(nthdigit(n))
我包装了此输出以使其更易于阅读。所有数字都是正确的。
- 141592653589793238462643383279502884197169399375105820974944592307816406 286208998628034825342117067982148086513282306647093844609550582231725359 408128481117450284102701938521105559644622948954930381964428810975665933 446128475648233786783165271201909145648566923460348610454326648213393607 260249141273724587006606315588174881520920962829254091715364367892892590360 011330530548820466521384146951941511609433057270365759591953092186117381 932611793105118548074462379962749567351885752724891227938183011949129833 673362440656643086021394946395224737190702179860943702770539217176293176176 752384674818467669405132000568127145263560827785771342757789609173637178 721468440901224953430146549585371050792279689258923542019956112129021021960 864034418159813629774771309960518707211349999998372978049951051059731732816 096318595024459455346908302642522308253344685035261931188171010003137838 752886587533208381420617177669147303598253490428755468731159562863882353 7875937519577818577805321712268066130019278766111959092164201989