Cython的计算不正确

时间:2011-01-19 01:30:14

标签: python cython pi

我实现了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版本的计算不正确?

3 个答案:

答案 0 :(得分:18)

你在Cython版本中使用float - 那是single precision!请改用double,它对应于Python的float(有趣的是)。 C类型float只有大约8位有效十进制数字,而double或Python float大约有16位数。

答案 1 :(得分: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 - 它可能比计算的其余部分长十倍。

答案 2 :(得分:-1)

你怎么知道它什么时候结束?您是否认为pi的值会在真值附近振荡,您会期望如果您在某个时刻停止了代码,那么您可能会有一个太高(或太低)的值?