/
calc_pi.py
76 lines (59 loc) · 1.69 KB
/
calc_pi.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#!/usr/bin/env python3
"""
pi.py - demo for progressbar usage
calculates pi to a certain number of digits and counts the number of 0 digits
"""
import progressbar
def calc_pi(limit): # Generator function
"""
Prints out the digits of PI
until it reaches the given limit
adapted from https://github.com/MrBlaise/learnpython/blob/master/Numbers/pi.py
"""
q, r, t, k, n, ell = 1, 0, 1, 1, 3, 3
decimal = limit
counter = 0
while counter != decimal + 1:
if 4 * q + r - t < n * t:
# yield digit
yield n
# insert period after first digit
if counter == 0:
yield '.'
# end
if decimal == counter:
break
counter += 1
nr = 10 * (r - n * t)
n = ((10 * (3 * q + r)) // t) - 10 * n
q *= 10
r = nr
else:
nr = (2 * q + r) * ell
nn = (q * (7 * k) + 2 + (r * ell)) // (t * ell)
q *= k
t *= ell
ell += 2
k += 1
n = nn
r = nr
def main():
widgets = [
' [', progressbar.Timer(), '] ',
progressbar.GranularBar(), ' ',
progressbar.Percentage(),
]
zeros = 0
m = 50_000
idx = 0
print(f"Calculating pi to {m} significant digits\n\n")
with progressbar.ProgressBar(max_value=m, widgets=widgets) as bar:
for digit in calc_pi(m + 2):
if digit == 0:
zeros += 1
if idx % 100 == 0:
bar.update(idx)
idx += 1
print(f"zeros in pi to {m} places are {zeros}")
if __name__ == '__main__':
main()