I implemented the Madhava–Leibniz series to calculate pi in Python, and then in Cython to improve the speed. The Python version:
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)
The Cython version:
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)
When I stopped the Python version it had correctly calculated pi to 3.141592. The Cython version eventually ended up at 3.141597 with some more digits that I don't remember (my terminal crashed) but were incorrect. Why are the Cython version's calculations incorrect?
You are using float
in the Cython version -- that's single precision! Use double
instead, which corresponds to Python's float
(funnily enough). The C type float
only has about 8 significant decimal digits, whereas double
or Python's float
have about 16 digits.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With