Depuis que c'était la journée du pi récemment, j'ai remarqué un certain nombre de défis qui vous demandent de calculer le pi.
Bien sûr, une quiche lorraine n’est pas une tarte (vous pouvez prétendre à un Bonus Bonus¹ de +1 si vous avez deviné le défi du titre). En tant que tel, votre travail consiste à écrire un algorithme ou une méthode qui ressemble au premier abord à Pi, mais dont la garantie est de ne pas converger vers Pi.
C'est un défi sournois, alors assurez-vous qu'il générera 3.14 ... pour un cas de test simple, par exemple avec 10 itérations de votre algorithme. C’est aussi un défi de popularité, alors ne vous laissez pas aller à l’évidence echo(pi)
et dites que la virgule flottante IEEE 754 arrondit les chiffres.
Le gagnant reçoit une quiche lorraine².
¹ Attention: pas réellement un score bonus. En réclamant le score, vous acceptez de me préparer une tarte avant la Journée Pi, 2016
² Avertissement: la quiche lorraine est utilisée comme une métaphore pour faire marquer votre réponse comme "acceptée"
la source
Réponses:
Algorithme
En utilisant le résultat bien connu:
on définit en Python 3:
Essai
Divulgacher
la source
Pour trouver pi, nous allons intégrer cette équation différentielle bien connue:
Avec une condition initiale
Il est bien connu que ce problème de valeur initiale converge vers π lorsque t augmente sans limite. Donc, tout ce dont nous avons besoin est de commencer avec une estimation raisonnable pour quelque chose entre 0 et 2π, et nous pouvons effectuer une intégration numérique. 3 est proche de π, nous allons donc choisir y = 3 pour commencer.
Voici quelques résultats à chacun pour différents nombres d'étapes:
Comment ça fonctionne:
la source
n
? ...for
décélération utiliset
, mais votre boucle utilisen
.Code:
J'ai essentiellement découvert cette séquence par accident. Il commence au fur
1, 1
et à mesure que chaque terme suivants(n)
est donné pars(n) = 2*s(n - 1) - s(n - 2) * (1 + m*m)
. Le résultat final est le plus petitn
tel ques(n) < 0
multiplié par2m
. Au fur et à mesurem
que la taille diminue, la précision devrait être croissante.Je suis à peu près sûr que ce sont des erreurs en virgule flottante
(1 + m*m)
, mais je ne suis pas sûr. Comme je l'ai dit, je suis tombé par hasard dessus. Je ne suis pas sûr de son nom officiel. N'essayez pas cela avec unm
trop petit ou il fonctionnera pour toujours (si en1 + m*m == 1
raison d'm
être si petit).Si quelqu'un connaît le nom de cette séquence ou pourquoi elle se comporte comme ça, je l'apprécierais.
la source