Python:mpmath除以大数时会失去精度
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python:mpmath除以大数时会失去精度,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4738字,纯文字阅读大概需要7分钟。
内容图文
![Python:mpmath除以大数时会失去精度](/upload/InfoBanner/zyjiaocheng/667/3ffb795e2a0c4aacac49f8510ac5ff6e.jpg)
我遇到了一种称为Chudnovsky算法的π算法.在Wikipedia上显示了Python实现,该实现使用Python附带的十进制软件包.但是最近,当我测试Gauss Legendre算法时,发现在处理高精度计算时,mpmath包的运行效率比十进制要高得多,因此我希望该算法可以与mpmath一起使用.这是我的code:
#!/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))
我确实相信Python本身可以处理大整数,所以我不会在var K,L,X上使用mpmath,因为在迭代中不会出现小数部分.我认为此事发生在S =(M * L)/ X上,因为X是一个很大的数字.
处理如此大量的信息使我感到非常困惑,希望您能提出建议,谢谢.
解决方法:
除了DSM提到的错字,该代码还有另一个问题.用k ** 3进行的除法必须是最小除法,而不是浮点除法.这是使用十进制和mpmath模块的修复版本.此代码在Python 2和amp; 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.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847564823378678316527120190914564856692346034861045432664821339360726024914127372458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194151160943305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912983367336244065664308602139494639522473719070217986094370277053921717629317675238467481846766940513200056812714526356082778577134275778960917363717872146844090122495343014654958537105079227968925892354201995611212902196086403441815981362977477130996051870721134999999837297804995105973173281609631859502445945534690830264252230825334468503526193118817101000313783875288658753320838142061717766914730359825349042875546873115956286388235378759375195778185778053217122680661300192787661119590921642019893809533
3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847564823378678316527120190914564856692346034861045432664821339360726024914127372458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194151160943305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912983367336244065664308602139494639522473719070217986094370277053921717629317675238467481846766940513200056812714526356082778577134275778960917363717872146844090122495343014654958537105079227968925892354201995611212902196086403441815981362977477130996051870721134999999837297804995105973173281609631859502445945534690830264252230825334468503526193118817101000313783875288658753320838142061717766914730359825349042875546873115956286388235378759375195778185778053217122680661300192787661119590921642019893809523
为了进行比较,以下是mp.pi的值:
mp.dps = 1008
print(mp.pi)
3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847564823378678316527120190914564856692346034861045432664821339360726024914127372458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194151160943305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912983367336244065664308602139494639522473719070217986094370277053921717629317675238467481846766940513200056812714526356082778577134275778960917363717872146844090122495343014654958537105079227968925892354201995611212902196086403441815981362977477130996051870721134999999837297804995105973173281609631859502445945534690830264252230825334468503526193118817101000313783875288658753320838142061717766914730359825349042875546873115956286388235378759375195778185778053217122680661300192787661119590921642019893809525
内容总结
以上是互联网集市为您收集整理的Python:mpmath除以大数时会失去精度全部内容,希望文章能够帮你解决Python:mpmath除以大数时会失去精度所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。