Python:mpmath在除掉大数时会失去精度

Python:mpmath在除掉大数时会失去精度,python,mpmath,Python,Mpmath,我遇到了一个π算法,叫做Chudnovsky算法。本文展示了一个Python实现,其中使用Python附带的usedecimal包。但是最近当我测试Gauss-Legendre算法时,我发现mpmath包在处理高精度计算时比decimal运行得更高效,所以我希望该算法能够与mpmath一起工作。这是我的: 我相信Python本身可以处理大整数,所以我不会在varK,L,X上使用mpmath,因为在迭代中不会出现小数部分。我认为这件事发生在S+=(M*L)/X上,因为X是一个相当大的数字。 处理这

我遇到了一个π算法,叫做Chudnovsky算法。本文展示了一个Python实现,其中使用Python附带的use
decimal
包。但是最近当我测试Gauss-Legendre算法时,我发现
mpmath
包在处理高精度计算时比
decimal
运行得更高效,所以我希望该算法能够与
mpmath
一起工作。这是我的:

我相信Python本身可以处理大整数,所以我不会在var
K,L,X
上使用
mpmath
,因为在迭代中不会出现小数部分。我认为这件事发生在
S+=(M*L)/X
上,因为
X
是一个相当大的数字。
处理这么多的问题让我很困惑,希望得到您的建议,谢谢

除了DSM提到的打字错误,该代码还有另一个问题。按
k**3
进行的除法需要是楼层除法,而不是浮动除法。以下是使用
decimal
mpmath
模块修复的版本。这段代码适用于Python2和Python3

from decimal import Decimal as Dec, getcontext as gc
from mpmath import mp

def pi_dec(maxK=70, prec=1008):
    gc().prec = prec
    K, M, L, X, S = 6, 1, 13591409, 1, 13591409 
    for k in range(1, maxK+1):
        M = (K**3 - (K<<4)) * M // k**3 
        L += 545140134
        X *= -262537412640768000
        S += Dec(M * L) / X
        K += 12
    pi = 426880 * Dec(10005).sqrt() / S
    return pi

def pi_mp(maxK=70, prec=1008):
    mp.dps = prec
    K, M, L, X, S = 6, 1, 13591409, 1, 13591409 
    for k in range(1, maxK+1):
        M = (K**3 - (K<<4)) * M // k**3 
        L += 545140134
        X *= -262537412640768000
        S += mp.mpf(M * L) / X
        K += 12
    pi = 426880 * mp.sqrt(10005) / S
    return pi


Pi = pi_dec()
print(Pi)

Pi = pi_mp()
print(Pi)
3.141592653589793238462643383279502884197169399375105820974944592307816406286208928034825342117067821480865132306647093844609550582317253594081284811174508270193852110555964462294930381964428810975663344461284756233788316527120190914564856666464646464646923483464646464646464646464646464646464646464646464646464646868686868484464646464646464646464646464646464646464646468686868686864646464646464646464646464646464646464646464653643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235442019956112129021196086403441815981362977477130996051870721134999999837297804995105973173281609631859550245945534690830264252308253344685032619311881710100031378387528865873208381420617766914730359825349875546873115928835353535353787575751957778185778053712268066130019776611959191919091919198809525


您的代码除以
K**3
。您链接的Chudnovsky算法除以
k**3
,这是循环索引(与您的相差1),而不是k。投票以打字错误结束。@DSM抱歉,O.O,感谢您的患者。。
from decimal import Decimal as Dec, getcontext as gc
from mpmath import mp

def pi_dec(maxK=70, prec=1008):
    gc().prec = prec
    K, M, L, X, S = 6, 1, 13591409, 1, 13591409 
    for k in range(1, maxK+1):
        M = (K**3 - (K<<4)) * M // k**3 
        L += 545140134
        X *= -262537412640768000
        S += Dec(M * L) / X
        K += 12
    pi = 426880 * Dec(10005).sqrt() / S
    return pi

def pi_mp(maxK=70, prec=1008):
    mp.dps = prec
    K, M, L, X, S = 6, 1, 13591409, 1, 13591409 
    for k in range(1, maxK+1):
        M = (K**3 - (K<<4)) * M // k**3 
        L += 545140134
        X *= -262537412640768000
        S += mp.mpf(M * L) / X
        K += 12
    pi = 426880 * mp.sqrt(10005) / S
    return pi


Pi = pi_dec()
print(Pi)

Pi = pi_mp()
print(Pi)
mp.dps = 1008
print(mp.pi)