Pi a tort
Une méthode courante de calcul de pi consiste à lancer des "fléchettes" dans une boîte 1x1 et à voir quel terrain dans le cercle unitaire par rapport au total lancé:
loop
x = rand()
y = rand()
if(sqrt(x*x + y*y) <= 1) n++
t++
pi = 4.0*(n/t)
Écrivez un programme qui semble devoir calculer correctement pi (en utilisant cette méthode ou d'autres méthodes courantes de calcul de pi) mais calcule tau (tau = 2 * pi = 6.283185307179586 ...) à la place. Votre code doit produire au moins les 6 premières décimales: 6.283185
Le gagnant est couronné le 6 juin (une semaine à partir d'aujourd'hui).
popularity-contest
underhanded
pi
Kyle Kanos
la source
la source
1
revient à demander une fonction qui semble retourner mais qui revient2
. Qui trompons-nous ici?Réponses:
Javascript
Au secours, je suis pris au piège dans une fabrique d'univers et je ne sais pas trop ce que je fais.
Math.atan2
est censé retourner pi avec de bonnes valeurs, non?Math.atan2(0, -0)
renvoie pi, donc si je le soustrais et l'ajoute, je devrais toujours avoir pi.la source
π - (-π)
>>> 0 === -0 ;true ;>>> Math.atan2(0, 0) ;0 ;>>> Math.atan2(0, -0) ;3.141592653589793
DE BASE
(Plus précisément, Chipmunk Basic )
Celui-ci utilise une série infinie découverte par Nilakantha Somayaji au XVe siècle:
Sortie
Si vous ne pouvez pas comprendre ce qui se passe, voici quelques conseils:
et
la source
i
égalfalse
? Et puis vous y ajoutez2
? Et il fonctionne???i == false
ce qui est similaire ài == 0
. Le fait est que la valeur initiale de l'accumulateurpi
n'est pas 0…false + 2 == 2
: Dbool
type, et utilise0
et non nul pour représenterfalse
et respectivementtrue
. Non pas que ce soit élégant, mais bon, c'est comme ça que ça marche.C - La longueur d'un demi-cercle d'unité
Une façon de calculer π est simplement de mesurer la distance au point se
(1, 0)
déplace lors de la rotation autour de l' origine à(-1, 0)
puisqu'il sera la moitié de la circonférence d'un cercle unitaire (qui est 2π ).Cependant, pas
sin(x)
oucos(x)
est nécessaire , car cela peut être fait par l' intensification tout autour de l' origine et en ajoutant la distance au point se déplace pour chaque étape . La plus petite taille pour chaque étape la plus précise de π vous obtiendrez.Remarque: le pas se termine lorsque y est inférieur à zéro (ce qui est juste au moment où il passe
(-1, 0)
).Il donne la sortie suivante:
la source
length
macro manque un sqrt. Est-ce prévu?x
ety
sont également échangés entre la définition et l'appel (sans effet)sqrt
a été accidentellement omis pour que la valeur de pi soit imprimée comme 6,28 ... Aussi +1 pour l'avoir remarquéx
ety
ce que je n'ai pas fait!C
(Cela a fini par être plus long que prévu, mais je le publierai quand même ...)
Au 17ème siècle, Wallis publie une série infinie pour Pi:
(Voir Nouveaux produits infinis de type wallis et catalan pour π, e et √ (2 + √2) pour plus d'informations)
Maintenant, pour calculer Pi, nous devons d'abord multiplier par deux pour factoriser le dénominateur:
Ma solution calcule ensuite la série infinie pour Pi / 2 et deux, puis multiplie les deux valeurs ensemble. Notez que les produits infinis sont incroyablement lents à converger lors du calcul des valeurs finales.
sortie:
la source
Java - Nilakantha Series
La série Nilakantha est donnée comme:
Ainsi, pour chaque terme, le dénominateur est construit en multipliant des entiers consécutifs, le début augmentant de 2 chaque terme. Notez que vous ajoutez / soustrayez des termes alternatifs.
Après cinq cents termes, nous obtenons une estimation raisonnable de pi:
la source
C ++: Madhava de Sangamagrama
Cette série infinie est maintenant connue sous le nom de Madhava-Leibniz :
Commencez par la racine carrée de 48 et multipliez-la par le résultat de la somme de (-3) -k / (2k + 1). Très simple et simple à mettre en œuvre:
Sortie:
la source
Python - Une alternative à la série Nilakantha
Il s'agit d'une autre série infinie pour calculer pi qui est assez facile à comprendre.
Pour cette formule, prenez 6 et commencez à alterner entre l'addition et la soustraction de fractions avec des numérateurs de 2 et des dénominateurs qui sont le produit de deux entiers consécutifs et leur somme. Chaque fraction suivante commence son ensemble d'entiers en augmentant de 1. Effectuez cela même quelques fois et les résultats se rapprochent assez de pi.
ce qui donne 6.283185.
la source
Math.h:
Sortie: 6.28
#include "Math.h" n'est pas la même chose que #include, mais juste en regardant le fichier principal, presque personne ne penserait à vérifier. Évident peut-être, mais un problème similaire est apparu dans un projet sur lequel je travaillais et est resté longtemps non détecté.
la source