7

我实现了 Madhava-Leibniz 系列在 Python 中计算 pi,然后在 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

float在 Cython 版本中使用 - 这是单精度!改用double它,它对应于 Python 的float(很有趣)。C 类型float只有大约 8 个有效十进制数字,而doublePythonfloat有大约 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 - 它可能比其余计算花费的时间长十倍。

于 2011-01-19T07:24:19.627 回答
-1

你怎么知道什么时候完成?您是否考虑过 for 的值pi会在真实值附近波动,并且您会期望如果您在某个时候停止代码,您可能会得到一个太高(或太低)的值?

于 2011-01-19T01:38:50.457 回答