1

我是 python 和编程的初学者,在 HTLCS 上做练习时已经遇到了障碍。

问题是使用 Liebniz 近似来计算 pi (3.14...) 的值。

这是我解决这个问题的可怜尝试:

def myPi():
    n = 0
    value = ((-1) ** n)/(2 * n + 1) 
    runningtotal = 0
    while True:
        runningtotal += value
        n += 1 
        value = ((-1) ** n)/(2 * n + 1)
    runningtotal *= 4

    return runningtotal

当然,由于 while True,Python 解释器 shell 永远不会完成我的函数,我理解诸如 while n != 5000 之类的解决方案也可以,但我希望 Python 自己找到终止点并返回结果。

我尝试运行 while 语句,直到 runningtotal 的值和更新的 runningtotal 的值在某个浮点数处相同,但由于某种原因在每个循环中两个值的最后一个浮点数丢失一个而失败。(runningtotal:3.14157,更新runningtotal:3.14158->runningtotal:3.14158,更新runningtotal:3.14157->重复)。

这是我在这个论坛上的第一个问题,所以如果我没有明确说明或违反了我不知道的 Stackflow 规则,请告诉我。

4

2 回答 2

0

浮点数具有固有的不精确性,测试它们是否相等是一项冒险的事情。我建议使用小公差而不是测试相等性。而不是oldTotal == newTotal,测试类似的东西abs(oldTotal-newTotal)<0.0001(或任何你喜欢的容差)。

于 2012-06-03T06:35:16.060 回答
0

我会使用任意精度的库来做这种事情,但普通的 Python 也可以。

这是我的做法:

precision = 10
epsilon = 10 ** (-precision)

while True:
  ...

  if abs(oldvalue - newvalue) < epsilon:
    break
于 2012-06-03T06:37:03.670 回答