Cython的计算不正确
我用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位数字。