Computing π a “infinito” di precisione binario in C #
Domanda
Finora sembra che l'equazione di Fabrice Bellard base 2 è la strada da percorrere
Per ironia della sorte ciò richiederà un tipo BigReal; dobbiamo questo per Net? NET 4.0 ha BigInteger.
Qualcuno ha una versione Haskell?
Soluzione
Dal momento che stai chiedendo una versione Haskell, qui è un documento di Jerzy Karczmarczuk, chiamato "la tecnica più inaffidabile nel mondo per calcolare π":
Questo documento è un exercice atipico codifica funzionali pigro, scritto per divertimento e l'istruzione. Può essere letto e compreso da chiunque capisce il linguaggio di programmazione Haskell. Mostriamo come implementare il Formula Bailey-Borwein-Ploué per π in un co-ricorsivo, modo incrementale che produce i numeri 3, 1, 4, 1, 5, 9.. . finché la memoria esaurimento. Questo non è un modo per procedere se qualcuno ha bisogno di molti cifre! La nostra strategia di codifica è perversa e pericolosa, ed è provably rompe. È basato su l'aritmetica per il dominio di infinite sequenze di cifre rappresentano frazioni proprie espansa in una base intero. Mostriamo come manipolare: aggiungere, moltiplicare per un intero, ecc tali sequenze dal da sinistra a destra all'infinito, che ovviamente non può funzionare in tutti casi a causa di ambiguità. Alcuni profonde conseguenze filosofiche sono discusso nelle conclusioni.
E 'in realtà non risolve il problema in modo efficace o molto pratico, ma è divertente e mostra alcuni dei problemi con l'aritmetica pigri precisione infinita.
Poi c'è anche questo scritto da Jeremy Gibbons .
Altri suggerimenti
Di gran lunga il mio preferito rubinetto Haskell per pi greco viene da Jeremy Gibbons:
pi = g(1,0,1,1,3,3) where
g(q,r,t,k,n,l) =
if 4*q+r-t<n*t
then n : g(10*q,10*(r-n*t),t,k,div(10*(3*q+r))t-10*n,l)
else g(q*k,(2*q+r)*l,t*l,k+1,div(q*(7*k+2)+r*l)(t*l),l+2)
Lo sfondo matematico che giustifica che l'attuazione può essere trovato in:
Wikipedia dettagli un sacco di modi per ottenere approssimazioni numeriche di pi qui . Essi hanno inoltre dare qualche esempio di pseudo-codice
Edit: Se siete interessati a questo tipo di problemi matematici senza avere alcun problema correlato del mondo reale per risolvere (che è sicuramente un buon atteggiamento da avere, secondo me), si può visitare il pagina Euler Progetto
Esiste questa possibilità di elaborare grandi numeri razionali in DLR basata su linguaggi dinamici (ad esempio, IronPython ). In alternativa è possibile utilizzare qualsiasi C portatile implementazione / C ++ di grandi numeri reali attraverso P / Invoke .