Cython的计算不正确

7 投票
3 回答
1593 浏览
提问于 2025-04-16 10:12

我用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 个回答

-1

你怎么知道什么时候结束呢?你有没有想过,pi的值会在真实值附近波动?这意味着如果你在某个时刻停止代码运行,得到的值可能会比真实值高(或者低)呢?

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)这个函数——这可能会比其他计算慢十倍。

18

你在Cython版本中使用了float,这就是所谓的单精度!建议你用double,它对应于Python中的float(有趣的是)。C语言中的float大约只能表示8位有效数字,而double或者Python的float可以表示大约16位数字。

撰写回答