Cython的计算结果不正确。

7

我在Python中实现了Madhava-Leibniz级数来计算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版本时,它已正确计算出圆周率为3.141592。Cython版本最终达到了3.141597,还有一些我不记得的更多数字(我的终端崩溃了),但是这些数字是不正确的。为什么Cython版本的计算结果是错误的?

3个回答

18

您在Cython版本中使用了float,这是单精度!请改用double,它对应于Python的float类型(很有趣)。C语言中的float只有大约8个有效数字,而double或Python的float有大约16个数字。


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函数,这可能比其他计算花费的时间长十倍。

-1
你如何知道什么时候它完成了?你考虑过 pi 的值会在真实值周围振荡,如果你在某个点停止代码,那么你可能得到一个太高(或太低)的值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接