Python:计算pi时为 "long int too large to convert to float"

标签 python python-3.x pi python-3.3

我在使用使用高斯-勒让德算法计算 pi 的 python 脚本时遇到此错误。在得到这个之前你最多只能使用 1024 次迭代:

    C:\Users\myUsernameHere>python Desktop/piWriter.py
    End iteration: 1025
    Traceback (most recent call last):
      File "Desktop/piWriter.py", line 15, in <module>
        vars()['t' + str(sub)] = vars()['t' + str(i)] - vars()['p' + str(i)] * math.
    pow((vars()['a' + str(i)] - vars()['a' + str(sub)]), 2)
    OverflowError: long int too large to convert to float

这是我的代码:

import math

a0 = 1
b0 = 1/math.sqrt(2)
t0 = .25
p0 = 1

finalIter = input('End iteration: ')
finalIter = int(finalIter)

for i in range(0, finalIter):
        sub = i + 1
        vars()['a' + str(sub)] = (vars()['a' + str(i)] + vars()['b' + str(i)])/ 2
        vars()['b' + str(sub)] = math.sqrt((vars()['a' + str(i)] * vars()['b' + str(i)]))
        vars()['t' + str(sub)] = vars()['t' + str(i)] - vars()['p' + str(i)] * math.pow((vars()['a' + str(i)] - vars()['a' + str(sub)]), 2)
        vars()['p' + str(sub)] = 2 * vars()['p' + str(i)]
        n = i

pi = math.pow((vars()['a' + str(n)] + vars()['b' + str(n)]), 2) / (4 * vars()['t' + str(n)])
print(pi)

理想情况下,我希望能够插入一个非常大的数字作为迭代值,稍后再回来查看结果。

感谢任何帮助! 谢谢!

最佳答案

float 只能表示最大为 sys.float_info.max 或 1.7976931348623157e+308 的数字。一旦你有一个超过 308 位数字(或左右)的整数,你就会被卡住。当 p1024 有 309 位数字时,您的迭代失败:

179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624224137216L

您必须为 pi 找到一种不同的算法,一种不需要这么大值的算法。

实际上,您必须小心周围的 float ,因为它们只是近似值。如果您修改程序以打印 pi 的逐次逼近值,它看起来像这样:

2.914213562373094923430016933707520365715026855468750000000000
3.140579250522168575088244324433617293834686279296875000000000
3.141592646213542838751209274050779640674591064453125000000000
3.141592653589794004176383168669417500495910644531250000000000
3.141592653589794004176383168669417500495910644531250000000000
3.141592653589794004176383168669417500495910644531250000000000
3.141592653589794004176383168669417500495910644531250000000000

换句话说,仅经过 4 次迭代,您的近似值就不再变得更好了。这是由于您使用的 float 不准确,可能从 1/math.sqrt(2) 开始。计算 pi 的许多数字需要非常仔细地理解数字表示。

关于Python:计算pi时为 "long int too large to convert to float",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13978556/

相关文章:

python - selenium2 chrome webdriver - 阻止确认的解决方法?

python - 仅打印所需的列

python - 防止在 Python 中四舍五入为零

c++ - 宏 C/C++ 的奇怪行为

python - 如何为 Windows 的 Python 包安装正确安装 C 编译器?

python - 在 python 中找不到 OCR 工具

python - 你如何在 Python 中打印上标?

python - 遍历多处理队列

python - 如何根据 Pandas 其他两列中的查找值分配最小值?

algorithm - pi(π)是怎么计算出来的?