Quelle commande pourrait imprimer pi pour moi? Je veux spécifier le nombre de chiffres imprimés, je n'ai rien trouvé en ligne. Je veux juste être capable d'imprimer pi.
Quelle commande pourrait imprimer pi pour moi? Je veux spécifier le nombre de chiffres imprimés, je n'ai rien trouvé en ligne. Je veux juste être capable d'imprimer pi.
Réponses:
Vous pouvez utiliser cette commande:
echo "scale=5; 4*a(1)" | bc -l
3.14159
Où scale est le nombre de chiffres après le point décimal.
Référence: http://www.tux-planet.fr/calculer-le-chiffre-pen-en-ligne-de-commande-sous-linux/
bash
et d' autres coquilles de support ici cordes: bc -l <<< "scale=5; 4*a(1)"
.
scale=1000
donne 999 chiffres corrects assez rapidement (le dernier chiffre est désactivé de 1, raisonnable puisque nous calculons pi / 4 et que nous multiplions ensuite par 4). scale=4000
donne 4000 chiffres corrects en quelques secondes. scale=10000
prend plus de temps que je n'ai de patience, mais donne probablement 9999 ou 10000 chiffres corrects.
Si vous avez tex(1)
installé:
tex --version | head -1 | cut -f2 -d' '
cut
. Plus de chiffres peuvent être imprimés en attendant longtemps et en exécutant à nouveau la commande.
Pour imprimer avec une précision arbitraire, vous pouvez utiliser bc
la formule suivante pi = 4*atan(1)
:
# bc -l
scale=<your precision>
4*a(1)
scale
option, pi = 3.141592..
mais avec echo "scale=5; 4*a(1)" | bc -l => 3.14156
quoi puis-je m'attendre à voir 3.14159
?
scale
spécifie la précision à utiliser pour le calcul. Ainsi, avec scale=5
, aucune opération n'utilisera plus de cinq chiffres fractionnaires pour une opération atomique.
Si vous voulez quelque chose qui puisse calculer la valeur de π, il y a plusieurs approches. La solution la plus évidente serait peut-être d'utiliser un paquet prêt à l'emploi tel que pi
(lien du paquet Debian) , qui, si la description du paquet Debian doit être approuvée, peut calculer la valeur avec une précision arbitraire, limitée uniquement par la mémoire.
pi
est en fait un exemple inclus dans la bibliothèque CLN (Class Library for Numbers) . Il inclut des exemples d'applications fournissant des outils permettant de générer des longueurs arbitraires de nombres tels que Pi, Fibonacci, etc. Des packages CLN sont disponibles pré-emballés dans Debian / Ubuntu (c'est ce que le lien Debian ci-dessus pointe vers).
$ ./pi 10
3.141592653
$ ./pi 20
3.1415926535897932384
Remarque: la source de ces exemples est ici dans la source pour la base de code CLN .
Sur Fedora, je devais télécharger l’archive source et la construire moi-même, mais elle se construit sans problème. Pour une raison quelconque, le paquet cln
sur Fedora n'inclut que la bibliothèque, mais néglige les exemples disponibles dans la version Debian / Ubuntu (ci-dessus).
Arch fournit le même programme dans le cln
package (merci Amphiteót ).
pi
ressemble exactement à ce que vous recherchez. Vous pouvez faire des choses comme pi 300
imprimer les 300 premiers chiffres, par exemple.
Pour un million de chiffres maximum, vous pouvez utiliser les éléments suivants (ici pour 3000 chiffres):
curl --silent http://www.angio.net/pi/digits/pi1000000.txt | cut -c1-3000
cut
termine? Si tel est le cas, je conviens que ce serait O (n).
Certaines des autres réponses affichent des chiffres incorrects aux derniers endroits de la sortie. Vous trouverez ci-dessous une variation de la réponse utilisantbc
mais avec un résultat correctement arrondi. La variable s
contient le nombre de chiffres significatifs (y compris3
devant le signe décimal).
$ bc -l <<< "s=5; scale=s+2; pi=4*a(1)+5*10^(-s); scale=s-1; pi/1"
3.1416
$ bc -l <<< "s=5; scale=s+2; pi=4*a(1); scale=s-1; pi/1"
3.1415
L'arrondi est effectué directement en format bc
. Cela n'a pas la limitation de la commande printf
qui utilise la représentation du double
type de langage C pour les nombres qui a une précision d'environ 17 chiffres significatifs. Voir la réponse en printf
arrondissant .
scale=s-1
définit le nombre de chiffres à tronquer. pi/1
divise le résultat par 1 pour appliquer la troncature. Simplepi
ne tronque pas le nombre.
Pour arrondir la moitié supérieure, il faut ajouter 5 au premier chiffre qui sera coupé (5 × 10 -s ) afin que, dans le cas de chiffres supérieurs à 5, le dernier chiffre restant sera incrémenté.
D'après les tests effectués par Hobbs, il semble que trois chiffres supplémentaires qui seront arrondis / coupés ( scale=s+2
) suffiront, même pour des nombres très longs.
Les exemples ci-dessus utilisent ici des chaînes qui sont supportées par exemple dans bash
, ksh
et zsh
. Si votre shell ne supporte pas ici string use echo
et pipe à la place:
$ echo "s=5; scale=s+2; pi=4*a(1); scale=s-1; pi/1" | bc -l
3.1415
Avec python2:
$ python -c "import math; print(str(math.pi)[:7])"
3.14159
(..)
cela fonctionne avec Python 2 et 3. Cela semble seulement avoir 12 chiffres.
python -c "import gmpy2; print(str(gmpy2.const_pi(8192))[:400])"
. Augmentez la précision pour plus de chiffres ... par exemplepython -c "import gmpy2; print(str(gmpy2.const_pi(16384))[:4400])"
from mpmath import mp; mp.dps = 1000000 ; print(mp.pi)
juste quelques secondes pour un million de chiffres. Pas mal du tout !!!.
En bash:
$ read -a a <<< $(grep M_PIl /usr/include/math.h) ; echo ${a[3]} | tr -d L
3.141592653589793238462643383279502884
afmtodit
nécessite groff
d'être installé. Ici sur Ubuntu (et les saveurs), ce n'est pas standard. JFYI.
Très simple en PHP en utilisant la fonction pi () intégrée:
<?php
echo round(pi(), 2);
?>
Comment ai-je raté cette question ...
Voici un petit programme Python pi que j’ai posté il ya quelques semaines sur Stack Overflow. Ce n'est pas particulièrement rapide, mais cela peut faire beaucoup de chiffres. :) Cependant, comme je l'ai mentionné dans ce fil de discussion, j'utilise généralement le module mpmath de Python pour l'arithmétique en précision arbitraire, et mpmath a un créateur de pi assez rapide.
Par exemple,
time python -c "from mpmath import mp;mp.dps=500000;print mp.pi" >bigpi
real 0m4.709s
user 0m4.556s
sys 0m0.084s
500000 décimales de pi en moins de 5 secondes, ce n'est pas si grave, à mon humble avis, vu qu'il tourne sur une machine dotée d'un processeur à cœur unique à 2 GHz, de 2 Go de RAM et écrit sur un lecteur IDE âgé.
from mpmath import mp; mp.dps = 1000000 ; print(mp.pi)
(après un pip3 installer mpmath) moins de deux secondes pour un million de chiffres. Pas mal du tout !!!.
Si vous avez node.js
installé, ceci fera de son mieux pour trouver le pi pour vous, bien que son meilleur ne soit pas très bon:
node -e 'for(a=0,b=4E8,m=Math,r=m.random;b--;)a+=(1>m.sqrt((c=r())*c+(d=r())*d));console.log(a/1E8)'
Exemples de sortie:
3.14157749
3.1416426
3.14159055
3.14171554
3.14176165
3.14157587
3.14161137
3.14167685
3.14172371
node -e 'console.log(Math.PI)'
est un peu meilleur que son meilleur.
echo pie
?
Méthode Monte Carlo
Voir, par exemple, cette pour une explication de cette méthode.
Mises en garde
Avantages
Amusement :-)
perl -Mbignum -E '
for(0 .. 1_000_000){
srand;
$x=rand; # Random x coordinate
$y=rand; # Random Y coordinate
$decision = $x**2 + $y**2 <=1 ? 1:0; # Is this point inside the unit circle?
$circle += $decision;
$not_circle += 1-$decision;
$pi = 4*($circle/($circle+$not_circle));
say $pi
}'
Remarque: je l'ai d'abord essayé sans, srand
mais il est resté bloqué 3.14
et les chiffres suivants ont continué à osciller, sans jamais converger. C'est probablement parce que, au bout d'un moment, le PRNG commence à se répéter. L’utilisation de of srand
évitera ou du moins allongera la période de la séquence pseudo-aléatoire. Tout cela est une conjecture, alors n'hésitez pas à me corriger si je me trompe.
bignum
opérations en Perl. Je crains et je ne connais aucune partie du programme ci-dessus qui nécessite un Perl plus récent. Quoi qu'il en soit, ce qui est intéressant, c'est l'algorithme lui-même. Essayez de l’implémenter dans la langue de votre choix si ce Perl ne fonctionne pas pour vous.
($x,$y,$circle,$not_circle)=(0,0,0);
avant la boucle pour vous assurer que toutes les variables sont définies avant d'être utilisées.
(0,0,0,0)
.
($x,$y,$circle,$not_circle)=(0,0,0,0)
. Au bout d'une minute ou deux, la valeur désirée traînait, puis elle s'est beaucoup rapprochée de 3,1409 avant que je m'arrête. Intéressant et amusant! Merci!
Vous pouvez utiliser un algorithme de broche pour pi. Le programme C suivant de Dik Winter et Achim Flammenkamp produira les 15 000 premiers chiffres de pi, un chiffre à la fois.
a[52514],b,c=52514,d,e,f=1e4,g,h;main(){for(;b=c-=14;h=printf("%04d",e+d/f))for(e=d%=f;g=--b*2;d/=g)d=d*b+f*(h?a[b]:f/5),a[b]=d%--g;}
PHP
Quelques exemples:
php -r "print pi();"
php -r 'echo M_PI;'
echo "<?=pi();" | php
Si vous voulez changer la précision, essayez:
php -d precision=100 -r 'echo pi();'
La taille d'un float dépend de la plate-forme, bien qu'un maximum d'environ 1.8e308 avec une précision d'environ 14 chiffres décimaux soit une valeur commune (format IEEE 64 bits). [Lire la suite]
Si vous recherchez une précision encore plus précise, consultez les solutions de programmation Rosetta Code ou Code Golf SE .
Connexes: logiciels permettant de calculer l'IP à au moins mille chiffres chez SR.SE
Voici un script qui imprime pi avec le nombre de chiffres spécifié (y compris '.') Par l'utilisateur.
pi.sh
#!/bin/bash
len=${1:-7}
echo "4*a(1)" | bc -l | cut -c 1-"$len"
sortie
$ ./pi.sh 10
3.14159265
et avec la valeur par défaut:
$ ./pi.sh
3.14159
J'ai vu des gens en utilisant scale
comme bc
option, mais dans mon cas ( bc 1.06.95
) cela ne sort pas la valeur correcte:
$ echo "scale=5;4*a(1)" | bc -l
3.14156
Remarquez le dernier chiffre.
./pi.sh 10
affiche neuf chiffres, en comptant l'initiale 3
. De plus, vous pointez le doigt de l'erreur d'arrondi, mais vos ./pi.sh 6
sorties 3.1415
, qui peuvent ne pas être optimales.
scale=X
option de bc
ne arrondira PAS le nombre, mais simplement couper le nombre au X-ème chiffre décimal.
J'aime la réponse d’Abey mais je n’ai pas aimé comment bc changeait le dernier chiffre.
echo "scale=5; 4*a(1)" | bc -l
3.14156
J'ai donc supprimé l'échelle utilisée printf pour définir le nombre de chiffres.
printf "%0.5f\n" $(echo "4*a(1)" | bc -l)
3.14159
printf
, les nombres en virgule flottante sont fortement limités par rapport à bc
. Ils sont représentés par le double
type de langage C avec une précision d'environ 17 chiffres, de sorte que même les chiffres non nuls après le 17e sont erronés! ------ J'ai ajouté une réponse avec un arrondi correct du résultat non limité parprintf
. ------ Pour vous assurer que cette commande fonctionne avec différents paramètres régionaux, vous devez procéder de la manière suivante: LC_ALL=C printf
...
Et si vous ne pouvez pas pour la vie de vous souvenir de cette arctan
chose? Ou en supposant que vous ne sachiez même pas que cette fonction existe bc
, essayez de mémoriser cette division simple:
echo "scale=6; 355 / 113" | bc
3.141592
Ne fonctionnera que pour 6 chiffres, mais pour des calculs non scientifiques, cela fonctionnera bien.
Si vous pensez ne pas vous souvenir de ces deux nombres, écrivez d'abord le dénominateur, puis le numérateur:
113 355
Ou pourquoi pas
11 33 55
"double 1, double 3, double 5". Tous les chiffres sont étranges. Pour calculer, divisez à nouveau le nombre à 6 chiffres en deux, et permutez le dénominateur et le numérateur avant de les diviser. C'est à peu près ça.
4 * arctan(1)
beaucoup plus facile de me rappeler que deux nombres à trois chiffres ... J'utiliserais facilement 335 au lieu de 355, ou 133 au lieu de 113.
On peut supposer que le PO s'intéresse à une commande shell courte, facile à mémoriser, pour imprimer π - mais la question ne dit pas vraiment cela. Cette réponse ignore cette hypothèse et répond à la question strictement telle que écrite;
Bien qu'il y ait déjà 18 réponses, une approche est toujours manquante - et avec tant de réponses, on pourrait penser que ce n'est pas la seule qui manque:
la plus triviale: comment imprimer π? Il suffit d'imprimer π!
Cette approche semble être trop inutile pour même y penser, mais je montrerai qu'elle a ses merrits:
Nous calculerions normalement la valeur de π. Je ne vois pas ce qui nous empêche d'optimiser la solution en calculant la valeur à l'avance. C'est une constante, tout compilateur le ferait.
Nous voulons un nombre de chiffres de π, avec une précision maximale. Nous pouvons donc simplement prendre le préfixe de la constante, sous forme de texte:
echo 3.1415926535897932384626433832795 | cut -b -7
3.14159
Une variante avec un argument explicite pour la précision, par exemple. pour la précision 5
:
echo 3.1415926535897932384626433832795 | cut -b -$((2+5))
3.14159
La précision maximale peut être choisie arbitrairement en utilisant une constante appropriée calculée à l'aide de l'une des autres réponses. Il n'est limité que par la longueur maximale d'une ligne de commande.
Il a une complexité de temps constante pour trouver la valeur.
Toutes les limites et contraintes sont évidentes, en raison de la faible complexité de la mise en œuvre.
Il gère avec précision la précision supérieure au maximum en renvoyant la constante dans toute la précision disponible (sans fin 0
).
Cette solution, bien que triviale, présente donc des avantages. Cela peut être utile lorsqu'il est utilisé dans une fonction shell, par exemple.
Les fonctionnalités de la solution ci-dessus peuvent également être implémentées sans créer de processus cut
(en supposant echo
que le shell est intégré). Elle utilise la commande printf
(normalement une commande intégrée) d'une manière quelque peu obscure:
la constante est complètement manipulée comme une chaîne (le format utilisé %s
), il n'y a pas d'arithmétique à virgule flottante impliquée, donc les limites de float
ou double
ne s'appliquent pas ici.
La valeur de précision de l' %s
échappement ( 5
dans l'exemple ci-dessous) spécifie la longueur du préfixe de chaîne à imprimer - qui est la précision. Le 3.
fait partie du printf
format pour le garder en dehors du calcul de précision.
$ printf "3.%.5s\n" 1415926535897932384626433832795
3.14159
Alternative avec précision comme argument séparé:
$ printf "3.%.*s\n" 5 1415926535897932384626433832795
3.14159
Ou légèrement plus lisible (Notez l'espace entre 3.
et 14159...
, ce sont des arguments séparés):
$ printf "%s%.5s\n" 3. 1415926535897932384626433832795
3.14159
On printf
peut s’attendre à ce que la variante à utiliser soit très rapide: printf
c’est un shell intégré aux shell communs comme bash
et zsh
, il ne crée aucun processus.
En outre, il ne touche à aucun type de code associé à une virgule flottante, mais uniquement à la manipulation de tableaux d'octets (explicitement, pas de caractères multi-octets). C'est généralement plus rapide, souvent beaucoup plus rapide que l'utilisation de la virgule flottante.
Il y a souvent des raisons de remplacer printf
par /usr/bin/printf
pour garantir la cohérence ou la compatibilité. Dans ce cas, je pense que nous pouvons utiliser la fonction intégrée - ce qui est important, car l'utilisation /usr/bin/printf
réduit l'avantage "rapide" en forçant un processus.
Un problème courant avec la printf
compatibilité est le format de sortie du nombre en fonction des paramètres régionaux. La séparation .
des nombres peut être modifiée en ,
fonction des paramètres régionaux. Mais nous n'utilisons pas de chiffres, mais simplement une constante de chaîne contenant un littéral .
- non affecté par les paramètres régionaux.
Stéphane Chazelas a souligné queprintf %.5s
fonctionne différemment danszsh
, en comptant les caractères, pas les octets comme d’habitude. Heureusement, nos constantes utilisent uniquement des caractères de la plage ASCII inférieure, codés par un octet par caractère dans tout codage pertinent, tant que nous utilisons le UTF-8
codage commun pour Unicode, et non un codage à largeur fixe.
printf %.5s
char (non byte) est basé sur zsh (de manière raisonnable, mais contre POSIX). ksh93
's %.5Ls
est basé sur le graphem.