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

def bdf_add(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 >= 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:
            bdfr = bdf_add(bdfr, bdfd)
        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)

During your visit to our site, NumWorks needs to install "cookies" or use other technologies to collect data about you in order to:

With the exception of Cookies essential to the operation of the site, NumWorks leaves you the choice: you can accept Cookies for audience measurement by clicking on the "Accept and continue" button, or refuse these Cookies by clicking on the "Continue without accepting" button or by continuing your browsing. You can update your choice at any time by clicking on the link "Manage my cookies" at the bottom of the page. For more information, please consult our <a href="https://www.numworks.com/legal/cookies-policy/">cookies policy</a>.