7

Python で pi を計算するために Madhava–Leibniz 級数を実装し、次に速度を向上させるために Cython で実装しました。Python バージョン:

from __future__ import division
pi = 0
l = 1
x = True
while True:
    if x:
        pi += 4/l
    else:
        pi -= 4/l
    x = not x
    l += 2
    print str(pi)

Cython バージョン:

cdef float pi = 0.0
cdef float l = 1.0
cdef unsigned short x = True
while True:
    if x:
        pi += 4.0/l
    else:
        pi -= 4.0/l
    x = not x
    l += 2
    print str(pi)

Python バージョンを停止すると、pi が 3.141592 に正しく計算されました。Cython のバージョンは最終的に 3.141597 になり、覚えていない (端末がクラッシュした) 数字がいくつかありましたが、正しくありませんでした。Cython バージョンの計算が正しくないのはなぜですか?

4

3 に答える 3

18

あなたはfloatCythonバージョンで使用しています - それは単精度です! double代わりに、Python のものに対応するものを使用してくださいfloat(面白いことに)。C 型の10 進数のfloat有効桁数は約 8 桁のみですがdouble、Python のfloat有効桁数は約 16 桁です。

于 2011-01-19T01:36:22.463 に答える
0

速度を上げたい場合は、次のようにループを一度展開することでロジックを簡素化できることに注意してください。

cdef double pi = 0.0
cdef double L = 1.0

while True:
    pi += 4.0/L - 4.0/(L+2.0)
    L += 4.0
    print str(pi)

また、ループ内で print を呼び出す必要がないことに注意してください。おそらく、残りの計算よりも 10 倍の時間がかかります。

于 2011-01-19T07:24:19.627 に答える
-1

完成したことはどうやってわかりますか?の値piが真の値を中心に振動し、ある時点でコードを停止すると、値が高すぎる (または低すぎる) 可能性があると考えたことはありますか?

于 2011-01-19T01:38:50.457 に答える