Python:当分割大数字时,mpmath会丢失精度

时间:2017-01-26 03:53:37

标签: python mpmath

我遇到了一种名为 Chudnovsky算法的π算法。在Wikipedia上显示了一个Python实现,它使用了Python附带的decimal包。但是最近当我测试高斯Legendre算法时,我发现mpmath包在运行高精度计算时运行效率比decimal高得多,所以我希望算法可以用{{} 1}}。这是我的code

mpmath

我相信Python本身可以处理大整数,因此我不会在var #!/usr/bin/env python from mpmath import * import pi_compare # A module aim to compare result with standard pi mp.dps = 1000 def pi(): K, M, L, X, S = 6, mpf('1'), 13591409, 1, mpf('13591409') for i in xrange(0,100): M = (K**3 - K*16) * M / K**3 L += 545140134 X *= -262537412640768000 S += (M * L) / X K += 12 return mpf('426880') * mpf('10005').sqrt() / S P = pi() print P print pi_compare.compare(str(P)) 上使用mpmath,因为在迭代中不会出现小数部分。我认为问题发生在K, L, X,因为S += (M * L) / X是一个非常大的数字。 它让我困惑了很多,处理这么大的数字,希望对你的建议,谢谢。

1 个答案:

答案 0 :(得分:3)

除了DSM提到的拼写错误之外,该代码还存在另一个问题。除k**3之前的划分需要是分区,而不是浮动分区。以下是使用decimalmpmath模块的修复版本。此代码适用于Python 2和Python 3。

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.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847564823378678316527120190914564856692346034861045432664821339360726024914127372458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194151160943305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912983367336244065664308602139494639522473719070217986094370277053921717629317675238467481846766940513200056812714526356082778577134275778960917363717872146844090122495343014654958537105079227968925892354201995611212902196086403441815981362977477130996051870721134999999837297804995105973173281609631859502445945534690830264252230825334468503526193118817101000313783875288658753320838142061717766914730359825349042875546873115956286388235378759375195778185778053217122680661300192787661119590921642 019893809533       3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847564823378678316527120190914564856692346034861045432664821339360726024914127372458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194151160943305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912983367336244065664308602139494639522473719070217986094370277053921717629317675238467481846766940513200056812714526356082778577134275778960917363717872146844090122495343014654958537105079227968925892354201995611212902196086403441815981362977477130996051870721134999999837297804995105973173281609631859502445945534690830264252230825334468503526193118817101000313783875288658753320838142061717766914730359825349042875546873115956286388235378759375195778185778053217122680661300192787661119590921642019 893809523

出于比较目的,这里是mp.pi

的值
mp.dps = 1008
print(mp.pi)
  

3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847564823378678316527120190914564856692346034861045432664821339360726024914127372458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194151160943305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912983367336244065664308602139494639522473719070217986094370277053921717629317675238467481846766940513200056812714526356082778577134275778960917363717872146844090122495343014654958537105079227968925892354201995611212902196086403441815981362977477130996051870721134999999837297804995105973173281609631859502445945534690830264252230825334468503526193118817101000313783875288658753320838142061717766914730359825349042875546873115956286388235378759375195778185778053217122680661300192787661119590921642 019893809525