使用十进制数据类型后无法打印1076位数字

时间:2018-07-16 11:14:48

标签: python

我编写了一个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数据类型中的默认设置,如果可以的话,是否有办法超越该精度限制?

1 个答案:

答案 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))

我包装了此输出以使其更易于阅读。所有数字都是正确的。

  
      
  1. 141592653589793238462643383279502884197169399375105820974944592307816406   286208998628034825342117067982148086513282306647093844609550582231725359   408128481117450284102701938521105559644622948954930381964428810975665933   446128475648233786783165271201909145648566923460348610454326648213393607   260249141273724587006606315588174881520920962829254091715364367892892590360   011330530548820466521384146951941511609433057270365759591953092186117381   932611793105118548074462379962749567351885752724891227938183011949129833   673362440656643086021394946395224737190702179860943702770539217176293176176   752384674818467669405132000568127145263560827785771342757789609173637178   721468440901224953430146549585371050792279689258923542019956112129021021960   864034418159813629774771309960518707211349999998372978049951051059731732816   096318595024459455346908302642522308253344685035261931188171010003137838   752886587533208381420617177669147303598253490428755468731159562863882353   7875937519577818577805321712268066130019278766111959092164201989
  2.