1

私はPythonとプログラミングの初心者であり、HTLCSで演習を行っているときにすでに障害にぶつかっています。

問題は、Liebniz近似を使用して円周率(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インタープリターシェルはwhile Trueのために関数を終了することはなく、while n!= 5000のようなソリューションも機能することは理解していますが、Pythonが終了点自体を見つけて結果を返すようにしたいです。

runningtotalの値と更新されたrunningtotalの値が特定の浮動小数点数で同じになるまで、whileステートメントを実行しようとしましたが、何らかの理由で、各ループで2つの値の最後の浮動小数点が1つ失われたため失敗しました。(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 に答える