Python:在leibniz pi近似中终止while语句

时间:2012-06-03 06:28:40

标签: python python-3.x

我是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

当然,Python解释器shell永远不会完成我的功能因为while而且我理解像n!= 5000这样的解决方案也可以工作,但是我希望Python找到终止点并返回结果。

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

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

2 个答案:

答案 0 :(得分:0)

浮点数具有固有的不精确性,对它们进行平等测试是一项风险很高的业务。我建议使用小容差而不是测试相等性。而不是oldTotal == newTotal,而是测试类似abs(oldTotal-newTotal)<0.0001(或任何您喜欢的宽容度)的内容。

答案 1 :(得分:0)

我会使用任意精度库来做这种事情,但是常规Python也可以。

我是这样做的:

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

while True:
  ...

  if abs(oldvalue - newvalue) < epsilon:
    break