Π calcul à la précision binaire « infini » en C #
Question
Jusqu'à présent, il semble que l'équation de base 2 de Fabrice Bellard est le chemin à parcourir
Ironie du sort cela exigera un type BigReal; devons-nous cela pour .Net? NET 4.0 a BigInteger.
Quelqu'un at-il une version Haskell?
La solution
Puisque vous demandez une version Haskell, ici est un document par Jerzy Karczmarczuk, appelé "la technique la plus Unreliable dans le monde pour calculer π":
Ce document est atypique dans un exercice paresseux codage fonctionnel, par écrit amusement et instruction. Il peut être lu et compris par tous ceux qui comprend le langage de programmation Haskell. Nous montrons comment mettre en œuvre la Bailey-Borwein-Ploue formule π d'une manière co-récursive, incrémentale qui produit les chiffres 3, 1, 4, 1, 5, 9.. . jusqu'à ce que la mémoire épuisement. Ce n'est pas un moyen de procéder si quelqu'un a besoin d'un grand nombre chiffres! Notre stratégie de codage est pervers et dangereux, et pauses démontrable vers le bas. C'est basé sur les plus Arithmétique le domaine de la séquences infinies de chiffres représentant les fractions propres élargi dans une base de nombre entier. Nous montrons comment manipuler: ajouter, multiplier par un nombre entier, etc. telles séquences de la gauche à droite ad infinitum, qui ne peut évidemment pas fonctionner dans tous cas en raison des ambiguïtés. Certains conséquences philosophiques profondes sont discuté dans les conclusions.
Il ne résout pas vraiment le problème d'une manière efficace ou très pratique, mais il est amusant et montre quelques-uns des problèmes avec précision infinie arithmétique paresseuse.
Ensuite, il y a aussi cet article par Jeremy Gibbons .
Autres conseils
De loin mon robinet Haskell favori pour pi vient de 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)
Le contexte mathématique qui justifie que la mise en œuvre se trouve dans:
Wikipedia détaille beaucoup de façons d'obtenir des approximations numériques de pi . Ils donnent également quelques pseudo-code exemple
Edit: Si vous êtes intéressé par ce genre de problèmes mathématiques sans avoir aucun problème du monde réel lié à résoudre (ce qui est certainement une bonne attitude à avoir, à mon humble avis), vous pouvez visiter le Euler Page projet
Il existe cette possibilité de traiter de grands nombres rationnels DLR à base de langages dynamiques (par exemple IronPython ). Ou vous pouvez utiliser l'implémentation C / C ++ portable de grands nombres réels par P / Invoke .