Bailey-Borwein-Plouffe

wormsmalltNon ho ancora finito, anzi sarà una storia lunga, ma ho trovato serendipicamente un esercizio, un test per vedere se ho capito qualcosa finora.
La scintilla è stato questo tweet: A shocking formula to calculate any digit of Pi
Sembra fattibile, così a prima vista.

bbpPer sicurezza provo con un linguaggio sensato, Python:

#!/usr/bin/python
# -*- coding: utf-8 -*-

piprec = 3.0 # valore sensato, secondo me 😉

pi = 0.0
for k in range(10):
    pi += 1. / 16 ** k * (4. / (8 * k + 1) - 2. / (8 * k + 4) -
                          1. / (8 * k + 5) - 1. / (8 * k + 6))
    dpi = pi - piprec
    print k, pi, dpi
    piprec = pi

bbp0

OK. Funziona. E adesso mx.

Ecco, non è che sono ancora praticissimo, anzi, ma provo. Comincio a impratichirmi, l’ho già detto che sono niubbo?

bbp1

OK, dimenticato la maiuscola per Print, ma sembra che Sum si possa usare, si può distribuire anche su più linee.

E (forse) si può anche scrivere la funzione in un file, verifico (ts.mx):

r = Sum[
        a + a^2,
        {a, 1, 3}
    ];
Print["il risultato è ", r]

bbp2Forse si può migliorare (ts1.mx):

r = Sum[
        a + a^2,
        {a, 1, 3}
    ];
Print["il risultato è ", r];

bbp3

no, devo ancora impratichirmi ma il calcolo c’è.

Non è nemmeno una soluzione migliore l’uso della pipe:

bbp4

OK, sono pronto, provo, ecco (bbp.mx):

Sum[
    1. / 16 ^ k (
        4. / (8 k + 1) - 2. / (8 k + 4) -
        1. / (8 k + 5) - 1. / (8 k + 6)),
    {k, 0, 9}
]

bbp5

Cool! provo a alzare il limite superiore della sommatoria, 100 invece di 9:

bbp6

Ho provato a variare il limite, per la mia configurazione questo è 12

 k     pi
 9 - 3.14159265358979115
10 - 3.14159265358979313
11 - 3.14159265358979323
12 - 3.14159265358979324

Poi non varia più. Da qualche parte c’è scritto come aumentare la precisione ma sono ancora troppo niubbo.

Ancora una cosa, risultato di una telefonata non su questo argomento bensì sui linguaggi di programmazione. Ce ne sono tanti, e ne vengono proposti di nuovi continuamente. Si usa quello che fa al caso nostro, anche in funzione dei propri gusti e preferenze; per esempio io sono affezionato a calc:

bbp7Si possono fare degli script con una sintassi C-like, ecco la versione calc di bbp.

#!/usr/bin/calc -f

/* bbp.cal - Bailey-Borwein-Plouffe formula */

piprec = 3.0;
pi = 0.0;
for (k = 0; k < 11; k++) {
	pi = pi + 1. / 16 ** k * (4. / (8 * k + 1) - 2. / (8 * k + 4) -
			       			  1. / (8 * k + 5) - 1. / (8 * k + 6));
	dpi = pi - piprec;
	print k, pi, dpi;
	piprec = pi;
}

bbp8

Domanda: Perché calc?
Risposta: Perché no? 😯

Ah, sì! Sembra che mx (Mathics) funzioni 😎

Posta un commento o usa questo indirizzo per il trackback.

Trackback

  • La precisione del computer | Ok, panico su 14 agosto 2014 alle 11:06

    […] sufficiente e siamo scivolati in una sessione di roba che adesso riassumo. Invece di continuare con π di cui o già raccontato ho proposto e di Eulero e/o Nepero, questo insomma. L’ispirazione me […]

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

%d blogger hanno fatto clic su Mi Piace per questo: