Quale comando potrebbe stampare pi per me? Voglio specificare quante cifre stampa, non sono riuscito a trovare nulla online. Voglio solo essere in grado di stampare pi.
Quale comando potrebbe stampare pi per me? Voglio specificare quante cifre stampa, non sono riuscito a trovare nulla online. Voglio solo essere in grado di stampare pi.
Risposte:
Puoi usare questo comando:
echo "scale=5; 4*a(1)" | bc -l
3.14159
Dove scala è il numero di cifre dopo il punto decimale.
Riferimento: http://www.tux-planet.fr/calculer-le-chiffre-pi-en-ligne-de-commande-sous-linux/
bash
e altre shell di supporto qui stringhe: bc -l <<< "scale=5; 4*a(1)"
.
scale=1000
fornisce 999 cifre corrette piuttosto rapidamente (l'ultima cifra è disattivata di 1, ragionevole poiché stiamo calcolando pi / 4 e quindi moltiplicando per 4). scale=4000
fornisce 4000 cifre corrette in pochi secondi. scale=10000
impiega più tempo di quanto ho pazienza, ma probabilmente fornisce 9999 o 10000 cifre corrette.
Se hai tex(1)
installato:
tex --version | head -1 | cut -f2 -d' '
cut
. È possibile stampare più cifre attendendo a lungo ed eseguendo nuovamente il comando.
Per la stampa con precisione arbitraria, è possibile utilizzare bc
e la formula pi = 4*atan(1)
:
# bc -l
scale=<your precision>
4*a(1)
scale
possibilità, pi = 3.141592..
ma con echo "scale=5; 4*a(1)" | bc -l => 3.14156
Vorrei poi aspettare di vedere 3.14159
?
scale
specifica la precisione da utilizzare per il calcolo, quindi con scale=5
nessuna operazione verranno utilizzate più di cinque cifre frazionarie per qualsiasi operazione atomica.
Se vuoi qualcosa che possa calcolare il valore di π, allora ci sono diversi approcci. Forse la soluzione più ovvia sarebbe quella di usare un pacchetto già pronto come pi
(collegamento del pacchetto Debian) , che se la descrizione del pacchetto di Debian è affidabile può calcolare il valore con una precisione arbitraria, limitata solo dalla memoria.
pi
è in realtà un esempio incluso nella libreria CLN (Class Library for Numbers) . Comprende applicazioni di esempio che forniscono strumenti per generare lunghezze arbitrarie di numeri come Pi, Fibonacci, ecc. I pacchetti CLN sono disponibili preconfezionati in Debian / Ubuntu (questo è ciò a cui punta il collegamento Debian sopra).
$ ./pi 10
3.141592653
$ ./pi 20
3.1415926535897932384
NOTA: l'origine di questi esempi è qui nell'origine per la base di codice CLN .
Su Fedora ho dovuto scaricare il tarball sorgente e costruirlo da solo, ma si costruisce con poca confusione. Per qualsiasi motivo il pacchetto cln
su Fedora include solo la libreria ma trascura gli esempi disponibili nella versione Debian / Ubuntu (sopra).
Arco fornisce lo stesso programma nella il cln
pacchetto (grazie Amphiteót ).
pi
sembra esattamente quello che stai cercando. Ad esempio, puoi fare cose come pi 300
stampare le prime 300 cifre.
Per un massimo di un milione di cifre è possibile utilizzare quanto segue (qui per 3000 cifre):
curl --silent http://www.angio.net/pi/digits/pi1000000.txt | cut -c1-3000
cut
esce? In tal caso, sono d'accordo, sarebbe O (n).
Alcune delle altre risposte mostrano cifre errate negli ultimi punti dell'output. Di seguito è riportata una variazione della risposta utilizzandobc
ma con un risultato correttamente arrotondato. La variabile s
contiene il numero di cifre significative (incluso 3
davanti al punto decimale).
$ 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'arrotondamento viene eseguito direttamente in bc
. Ciò non ha la limitazione del comando printf
che utilizza la rappresentazione del double
tipo di linguaggio C per i numeri con una precisione di circa 17 cifre significative. Vedi la risposta con printf
arrotondamento .
scale=s-1
imposta il numero di cifre su cui troncare. pi/1
divide il risultato per 1 per applicare il troncamento. Semplice pi
non tronca il numero.
L'arrotondamento per metà richiede di aggiungere 5 alla prima cifra che verrà tagliata (5 × 10 -s ) in modo che in caso di cifre più alte di 5 uguale all'ultima cifra che rimarrà verrà incrementata.
Dai test di Hobbs sembra che tre cifre aggiuntive che verranno arrotondate / troncate ( scale=s+2
) saranno sufficienti anche per numeri molto lunghi.
Gli esempi sopra usano qui stringhe che sono supportate ad esempio in bash
, ksh
e zsh
. Se la tua shell non supporta qui usa stringhe echo
e pipe invece:
$ echo "s=5; scale=s+2; pi=4*a(1); scale=s-1; pi/1" | bc -l
3.1415
Con python2:
$ python -c "import math; print(str(math.pi)[:7])"
3.14159
(..)
questo funziona in Python 2 e 3. Sembra avere solo 12 cifre.
python -c "import gmpy2; print(str(gmpy2.const_pi(8192))[:400])"
. Aumenta la precisione per più cifre ... ad es.python -c "import gmpy2; print(str(gmpy2.const_pi(16384))[:4400])"
from mpmath import mp; mp.dps = 1000000 ; print(mp.pi)
solo un paio di secondi per un milione di cifre. Non è affatto male !!!.
In bash:
$ read -a a <<< $(grep M_PIl /usr/include/math.h) ; echo ${a[3]} | tr -d L
3.141592653589793238462643383279502884
afmtodit
richiede groff
l'installazione. Qui su Ubuntu (e sapori), è non è standard. JFYI.
Molto semplice in PHP usando la funzione pi () integrata:
<?php
echo round(pi(), 2);
?>
Come ho perso questa domanda ...
Ecco un mio piccolo programma Python pi che ho pubblicato un paio di settimane fa su Stack Overflow. Non è particolarmente veloce, ma può fare molte cifre. :) Comunque, come ho detto in quel thread, generalmente uso il modulo mpmath di Python per l'aritmetica di precisione arbitraria e mpmath ha un creatore di pi piuttosto veloce.
Per esempio,
time python -c "from mpmath import mp;mp.dps=500000;print mp.pi" >bigpi
real 0m4.709s
user 0m4.556s
sys 0m0.084s
500000 decimali di pi in meno di 5 secondi non sono troppo squallidi, IMHO, considerando che è in esecuzione su una macchina con un processore single core da 2 GHz, 2 gig di RAM e la scrittura su un disco IDE anziano.
from mpmath import mp; mp.dps = 1000000 ; print(mp.pi)
(dopo l'installazione di pip3 mpmath) in meno di due secondi per un milione di cifre. Non è affatto male !!!.
Se hai node.js
installato, questo farà del suo meglio per trovare pi per te, anche se il suo meglio non è molto buono:
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)'
Output di esempio:
3.14157749
3.1416426
3.14159055
3.14171554
3.14176165
3.14157587
3.14161137
3.14167685
3.14172371
node -e 'console.log(Math.PI)'
è un po 'meglio del suo meglio.
echo pie
?
Metodo Monte Carlo
Vedi, ad esempio, questo per una spiegazione di questo metodo.
Avvertenze
vantaggi
Divertimento :-)
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
}'
Nota: l'ho provato per la prima volta senza, srand
ma si è bloccato 3.14
e le cifre successive hanno continuato a oscillare, senza mai convergere. Questo probabilmente perché dopo un po 'il PRNG inizia a ripetersi. L'uso di srand
eviterà questo o almeno allungherà il periodo della sequenza pseudo-casuale. Questa è tutta una congettura, quindi sentiti libero di correggermi se sbaglio.
bignum
operazioni in Perl, temo e non conosco particolari parti del programma sopra che richiedono un Perl più recente. Comunque, ciò che è interessante di questo è l'algoritmo stesso. Prova a implementarlo nella tua lingua preferita se questo Perl non funziona per te.
($x,$y,$circle,$not_circle)=(0,0,0);
prima del ciclo per assicurarti che tutte le variabili siano definite prima di essere utilizzate.
(0,0,0,0)
.
($x,$y,$circle,$not_circle)=(0,0,0,0)
. Dopo un minuto o due si è aggirato attorno al valore desiderato, quindi è andato molto più vicino a 3.1409 prima che mi fermassi. Interessante e divertente! Grazie!
Puoi usare un algoritmo spigot per pi. Il seguente programma C di Dik Winter e Achim Flammenkamp produrrà le prime 15.000 cifre di pi, una cifra alla volta.
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
Alcuni esempi:
php -r "print pi();"
php -r 'echo M_PI;'
echo "<?=pi();" | php
Se vuoi cambiare la precisione prova:
php -d precision=100 -r 'echo pi();'
La dimensione di un float dipende dalla piattaforma, sebbene un massimo di ~ 1,8e308 con una precisione di circa 14 cifre decimali sia un valore comune (il formato IEEE a 64 bit). [leggi di più]
Se stai cercando una precisione ancora più accurata, controlla Rosetta Code o Code Golf SE per alcune soluzioni di programmazione.
Correlati: software in grado di calcolare PI ad almeno un migliaio di cifre su SR.SE
Ecco uno script che stampa pi con il numero di cifre specificato (incluso '.') Dall'utente.
pi.sh
#!/bin/bash
len=${1:-7}
echo "4*a(1)" | bc -l | cut -c 1-"$len"
produzione
$ ./pi.sh 10
3.14159265
e con valore predefinito:
$ ./pi.sh
3.14159
Ho visto persone che usano scale
come bc
opzione, ma nel mio caso ( bc 1.06.95
) questo non produce il valore corretto:
$ echo "scale=5;4*a(1)" | bc -l
3.14156
Si noti l'ultima cifra.
./pi.sh 10
stampe sono di nove cifre, contando l'iniziale 3
. Inoltre, stai indicando l'errore di arrotondamento, ma le tue ./pi.sh 6
uscite 3.1415
, che potrebbero non essere ottimali.
scale=X
opzione bc
NON arrotonderà il numero, ma semplicemente taglierà il numero alla cifra decimale X.
Mi piace la risposta di Abey ma non mi è piaciuto come bc stesse cambiando l'ultima cifra.
echo "scale=5; 4*a(1)" | bc -l
3.14156
Quindi ho rimosso la scala usando printf per impostare il numero di cifre.
printf "%0.5f\n" $(echo "4*a(1)" | bc -l)
3.14159
printf
ha una grave limitazione dei numeri in virgola mobile rispetto a bc
. Sono rappresentati dal double
tipo di linguaggio C con una precisione di circa 17 cifre, quindi anche le cifre diverse da zero dopo il 17 ° sono fasulle! ------ Ho aggiunto una risposta con arrotondamento corretto del risultato non limitato daprintf
. ------ Anche per assicurarti che questo comando LC_ALL=C printf
E se non riesci per la vita a ricordare questa arctan
cosa? O supponendo che tu non sappia nemmeno che questa funzione esiste bc
, quindi prova a memorizzare questa semplice divisione:
echo "scale=6; 355 / 113" | bc
3.141592
Funzionerà solo per 6 cifre, ma per i calcoli non scientifici questo andrà bene.
Se pensi di non ricordare nemmeno questi due numeri, scrivi prima il denominatore, quindi il numeratore:
113 355
O perché no
11 33 55
"doppio 1, doppio 3, doppio 5". Tutte le cifre sono strane. Per calcolare, dividere nuovamente il numero di 6 cifre a metà e scambiare denominatore e numeratore prima di dividerli. Questo è tutto.
4 * arctan(1)
molto più facile ricordare che 2 numeri a tre cifre ... Userei facilmente 335 invece di 355 o 133 invece di 113.
Si può presumere che l'OP sia interessato a un comando di shell breve e facile da memorizzare per stampare π - ma la domanda non lo dice davvero. Questa risposta ignora tale presupposto e risponde alla domanda rigorosamente come scritto;
Mentre ci sono già 18 risposte, manca ancora un approccio - e con così tante risposte, si potrebbe pensare che non sia l'unico che manca:
Quello banale: come stampare π? Basta stampare π!
Questo approccio sembra essere troppo inutile per pensarci, ma mostrerò che ha le sue allegre:
Normalmente calcoliamo il valore di π. Non vedo cosa ci impedisce di ottimizzare la soluzione, precalcolando il valore: è una costante, qualsiasi compilatore lo farebbe.
Vogliamo un numero di cifre di π, con la massima precisione. Quindi possiamo semplicemente prendere il prefisso della costante, come testo:
echo 3.1415926535897932384626433832795 | cut -b -7
3.14159
Una variante con un argomento esplicito per la precisione, ad es. per precisione 5
:
echo 3.1415926535897932384626433832795 | cut -b -$((2+5))
3.14159
La massima precisione può essere scelta arbitrariamente usando una costante adatta calcolata usando una delle altre risposte. È limitato solo dalla lunghezza massima di una riga di comando.
Ha una complessità temporale costante per la ricerca del valore.
Rende evidenti tutti i limiti e i vincoli, in base alla bassa complessità dell'implementazione.
Gestisce con precisione una precisione maggiore del massimo restituendo la costante nella massima precisione disponibile (senza trascinamento 0
).
Quindi questa soluzione, sebbene banale, ha dei vantaggi. Può essere utile quando viene utilizzato in una funzione shell, ad esempio.
La funzionalità della soluzione sopra può anche essere implementata senza creare un processo per cut
(supponendo che echo
sia incorporato nella shell). Usa il comando printf
(normalmente un builtin) in un modo un po 'oscuro:
la costante è completamente gestita come una stringa (il formato utilizza %s
), non vi è alcun calcolo in virgola mobile, quindi i limiti di float
o double
non si applicano qui.
Il valore di precisione %s
dell'escape ( 5
nell'esempio seguente) specifica la lunghezza del prefisso della stringa da stampare, che è la precisione. Fa 3.
parte del printf
formato per tenerlo fuori dal calcolo di precisione.
$ printf "3.%.5s\n" 1415926535897932384626433832795
3.14159
Alternativa con precisione come argomento separato:
$ printf "3.%.*s\n" 5 1415926535897932384626433832795
3.14159
O leggermente più leggibile (Nota lo spazio tra 3.
e 14159...
, sono argomenti separati):
$ printf "%s%.5s\n" 3. 1415926535897932384626433832795
3.14159
printf
Ci si può aspettare che la variante che usi sia molto veloce: poiché printf
è una shell integrata in shell comuni come bash
e zsh
, non crea alcun processo.
Inoltre, non tocca alcun tipo di codice in virgola mobile, ma solo la manipolazione di array di byte (caratteri esplicitamente non multibyte). Questo di solito è più veloce, spesso molto più veloce dell'uso del virgola mobile.
Spesso, ci sono ragioni per sostituire printf
da /usr/bin/printf
a consistenza garanzia o compatibilità. In questo caso, penso che possiamo usare il builtin, il che è importante, poiché l'uso /usr/bin/printf
riduce il vantaggio "veloce" tramite il fork di un processo.
Un problema comune con la printf
compatibilità è il formato di output del numero in base alla locale. La separazione .
per i numeri può essere modificata in ,
base all'impostazione internazionale; Ma non usiamo numeri, solo una costante di stringa contenente un valore letterale .
, non influenzato dalle impostazioni locali.
StéphaneChazelas lo ha sottolineatoprintf %.5s
funziona diversamentezsh
, contando i caratteri, non i byte come al solito. Fortunatamente, le nostre costanti utilizzano solo caratteri nell'intervallo ASCII inferiore, che è codificato da un byte per carattere in qualsiasi codifica pertinente, purché utilizziamo la UTF-8
codifica comune per Unicode e non una codifica a larghezza fissa.
printf %.5s
è char (non byte) basato su zsh (sensibilmente, ma rispetto a POSIX). ksh93
's %.5Ls
si basa Graphem.