# bdf_pi.py

Created by andreanx

Created on March 03, 2023

2.22 KB

bdf_pi(n) calcule le nombre π avec n chiffres significatifs (et donc n - 1 décimales). Pour l’afficher sur plusieurs lignes, utiliser demo(0) pour l’écran graphique, demo(1) pour la console en grande police, demo(1, 0) pour la console en petite police.

```from kandinsky import draw_string

def bdf_new(d0, nd):
bdf = bytes((d0,)) + bytes(nd - 1)
return bdf

c = 0
bdfr = b''
for i in range(len(bdf1) - 1, -1, -1):
v = bdf1[i] + bdf2[i] + c
if i:
c = v >= 10
if c:
v -= 10
bdfr = bytes((v,)) + bdfr
return bdfr

def bdf_sub(bdf1, bdf2):
c = 0
bdfr = b''
for i in range(len(bdf1) - 1, -1, -1):
v = bdf1[i] - bdf2[i] - c
if i:
c = v < 0
if c:
v += 10
bdfr = bytes((v,)) + bdfr
return bdfr

def bdf_times(bdf, k):
c = 0
bdfr = b''
for i in range(len(bdf) - 1, -1, -1):
v = k*bdf[i] + c
if i:
c = v // 10
if c:
v -= 10 * c
bdfr = bytes((v,)) + bdfr
return bdfr

def bdf_div(bdf, k):
c = 0
bdfr = b''
for i in range(len(bdf)):
x = 10*c + bdf[i]
c = x % k
bdfr += bytes((x // k,))
return bdfr

def bdf_ataninv(d, n):
bdf0 = bdf_new(0, n)
bdf1 = bdf_new(1, n)
k1 = d
k2 = 1
d2 = d ** 2
bdfr = bdf0
bdfd = bdf_div(bdf1, k1)
while bdfd != bdf0:
if k2 % 4 == 3:
bdfr = bdf_sub(bdfr, bdfd)
else:
k1 *= d2
k2 += 2
bdfd = bdf_div(bdf1, k1 * k2)
return bdfr

def bdf_pi(n):
return bdf_times(bdf_sub(bdf_times(bdf_ataninv(5, n), 4), bdf_ataninv(239, n)), 4)

def print_bdf(bdf, l):
s = str(bdf[0]) + '.'
for d in bdf[1:]:
if len(s) == l:
print(s)
s = ''
s += str(d)
if len(s):
print(s)

def draw_bdf(bdf, l):
y = -3
s = str(bdf[0]) + '.'
for d in bdf[1:]:
if len(s) == l:
draw_string(s, 0, y)
s = ''
y += 14
s += str(d)
if len(s):
draw_string(s, 0, y)

def demo(shell=True, big=True):
if shell:
bdfpi = bdf_pi(big and 359 or 687)
print_bdf(bdfpi, big and 30 or 43)
else:
bdfpi = bdf_pi(511)
draw_bdf(bdfpi, 32)

# shell in big font
demo(1, 1)
# graphic (big font)
#demo(0)
# shell in small font
#demo(1, 0)```