我实现了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版本的计算不正确?
答案 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
的值会在真值附近振荡,您会期望如果您在某个时刻停止了代码,那么您可能会有一个太高(或太低)的值?