Welcher Befehl könnte pi für mich drucken? Ich möchte angeben, wie viele Stellen gedruckt werden sollen. Ich konnte online nichts finden. Ich möchte nur Pi drucken können.
Welcher Befehl könnte pi für mich drucken? Ich möchte angeben, wie viele Stellen gedruckt werden sollen. Ich konnte online nichts finden. Ich möchte nur Pi drucken können.
Antworten:
Sie können diesen Befehl verwenden:
echo "scale=5; 4*a(1)" | bc -l
3.14159
Wobei scale die Anzahl der Nachkommastellen ist.
Referenz: http://www.tux-planet.fr/calculer-le-chiffre-pi-en-ligne-de-commande-sous-linux/
bash
und andere Shells hier Strings unterstützt: bc -l <<< "scale=5; 4*a(1)"
.
scale=1000
gibt ziemlich schnell 999 korrekte Ziffern aus (die letzte Ziffer ist um 1 versetzt, da wir pi / 4 berechnen und dann mit 4 multiplizieren). scale=4000
gibt in wenigen Sekunden 4000 richtige Stellen. scale=10000
dauert länger als ich habe geduldig, gibt aber wahrscheinlich 9999 oder 10000 richtige Ziffern.
Wenn Sie tex(1)
installiert haben:
tex --version | head -1 | cut -f2 -d' '
cut
. Sie können weitere Ziffern drucken, indem Sie lange warten und den Befehl erneut ausführen.
Zum Drucken mit beliebiger Genauigkeit können Sie bc
und die Formel verwenden pi = 4*atan(1)
:
# bc -l
scale=<your precision>
4*a(1)
scale
Option, pi = 3.141592..
aber mit echo "scale=5; 4*a(1)" | bc -l => 3.14156
wem würde ich dann rechnen 3.14159
?
scale
Gibt die Genauigkeit an, die für die Berechnung verwendet werden soll. Daher werden bei scale=5
keiner Operation mehr als fünf Nachkommastellen für eine atomare Operation verwendet.
Wenn Sie etwas wollen, das den Wert von π berechnen kann , gibt es mehrere Ansätze. Die vielleicht naheliegendste Lösung wäre die Verwendung eines vorgefertigten Pakets wie pi
(Debian-Paket-Link) , das, wenn Debians Paketbeschreibung als vertrauenswürdig eingestuft wird, den Wert mit einer willkürlichen Genauigkeit berechnen kann, die nur durch den Speicher begrenzt ist.
pi
ist eigentlich ein Beispiel, das in der CLN-Bibliothek (Class Library for Numbers) enthalten ist . Es enthält Beispielanwendungen, die Werkzeuge zum Erzeugen von Zahlen beliebiger Länge wie Pi, Fibonacci usw. bereitstellen. CLN-Pakete sind in Debian / Ubuntu vorab gepackt erhältlich (darauf weist der obige Debian-Link hin).
$ ./pi 10
3.141592653
$ ./pi 20
3.1415926535897932384
HINWEIS: Die Quelle dieser Beispiele befindet sich hier in der Quelle für die CLN-Codebasis .
Auf Fedora musste ich das Quell-Tarball herunterladen und es selbst erstellen, aber es funktioniert ohne großen Aufwand. Aus irgendeinem Grund enthält das Paket cln
auf Fedora nur die Bibliothek, vernachlässigt jedoch die Beispiele, die in der Debian / Ubuntu-Version (oben) verfügbar sind.
Arch bietet das gleiche Programm in dem cln
Paket (dank Amphiteót ).
pi
klingt genau so, wie Sie es suchen. Sie können pi 300
beispielsweise die ersten 300 Stellen drucken.
Für bis zu eine Million Stellen können Sie Folgendes verwenden (hier für 3000 Stellen):
curl --silent http://www.angio.net/pi/digits/pi1000000.txt | cut -c1-3000
cut
. Wenn das der Fall ist, stimme ich zu, wäre es O (n).
Einige der anderen Antworten zeigen falsche Ziffern an den letzten Stellen der Ausgabe. Nachfolgend finden Sie eine Variation der Antwort unter Verwendung von,bc
jedoch mit einem korrekt gerundeten Ergebnis. Die Variable s
enthält die Anzahl der signifikanten Stellen (einschließlich 3
vor dem Dezimalpunkt).
$ 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
Die Rundung erfolgt direkt in bc
. Dies hat nicht die Begrenzung des Befehls printf
, der die C - Sprache verwendet double
Typ Darstellung für die Zahlen , die eine Genauigkeit von etwa 17 signifikanten Ziffern hat. Siehe die Antwort mit printf
Rundung .
scale=s-1
Legt die Anzahl der Stellen fest, auf die gekürzt werden soll. pi/1
dividiert das Ergebnis durch 1, um die Kürzung anzuwenden. Simple pi
schneidet die Zahl nicht ab.
Beim Aufrunden der Hälfte muss 5 zur ersten Stelle addiert werden, die abgeschnitten wird (5 × 10 -s ), damit bei höheren Stellen als 5 die letzte verbleibende Stelle inkrementiert wird.
Aus den Tests von Hobbs geht hervor, dass drei zusätzliche Stellen, die gerundet / abgeschnitten werden ( scale=s+2
), auch für sehr lange Zahlen ausreichen.
In den obigen Beispielen werden hier Zeichenfolgen verwendet, die beispielsweise in unterstützt werdenbash
, ksh
und zsh
. Wenn Ihre Shell dies nicht unterstützt, verwenden Sie echo
stattdessen string use und pipe:
$ echo "s=5; scale=s+2; pi=4*a(1); scale=s-1; pi/1" | bc -l
3.1415
Mit python2:
$ python -c "import math; print(str(math.pi)[:7])"
3.14159
(..)
funktioniert das mit Python 2 und 3. Scheint nur 12 Stellen zu haben.
python -c "import gmpy2; print(str(gmpy2.const_pi(8192))[:400])"
. python -c "import gmpy2; print(str(gmpy2.const_pi(16384))[:4400])"
from mpmath import mp; mp.dps = 1000000 ; print(mp.pi)
nur ein paar Sekunden für eine Million Stellen. Gar nicht so schlecht !!!.
In der Bash:
$ read -a a <<< $(grep M_PIl /usr/include/math.h) ; echo ${a[3]} | tr -d L
3.141592653589793238462643383279502884
afmtodit
muss groff
installiert sein. Hier auf Ubuntu (& Flavours) ist es nicht Standard. JFYI.
Sehr einfach in PHP mit der eingebauten Funktion pi ():
<?php
echo round(pi(), 2);
?>
Wie habe ich diese Frage verpasst ...
Hier ist ein kleines Python-Pi-Programm von mir, das ich vor ein paar Wochen auf Stack Overflow gepostet habe. Es ist nicht besonders schnell, aber es kann viel bewirken Ziffern machen. :) Wie ich jedoch in diesem Thread erwähnt habe, verwende ich im Allgemeinen das mpmath-Modul von Python für Arithmetik mit willkürlicher Genauigkeit, und mpmath hat einen ziemlich schnellen pi-Maker.
Z.B,
time python -c "from mpmath import mp;mp.dps=500000;print mp.pi" >bigpi
real 0m4.709s
user 0m4.556s
sys 0m0.084s
500000 Dezimalstellen Pi in weniger als 5 Sekunden sind meiner Meinung nach nicht allzu schäbig, wenn man bedenkt, dass sie auf einer Maschine mit einem Single-Core-2-GHz-Prozessor, 2 Gigabyte RAM und einem älteren IDE-Laufwerk ausgeführt werden.
from mpmath import mp; mp.dps = 1000000 ; print(mp.pi)
(nach einer Pip3-Installation von mpmath) unter zwei Sekunden für eine Million Stellen. Gar nicht so schlecht !!!.
Wenn Sie node.js
installiert haben, wird dies sein Bestes tun, um pi für Sie zu finden, obwohl das Beste nicht sehr gut ist:
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)'
Beispielausgaben:
3.14157749
3.1416426
3.14159055
3.14171554
3.14176165
3.14157587
3.14161137
3.14167685
3.14172371
node -e 'console.log(Math.PI)'
desto besser.
echo pie
?
Monte-Carlo-Methode
In diesem Beispiel finden Sie eine Erläuterung dieser Methode.
Vorbehalte
Vorteile
Spaß :-)
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
}'
Hinweis: Ich habe es zuerst ohne ausprobiert, srand
aber es blieb hängen, 3.14
und die Ziffern danach schwangen weiter, konvergierten nie. Dies liegt wahrscheinlich daran, dass sich das PRNG nach einer Weile wiederholt. Die Verwendung von srand
wird diese vermeiden oder zumindest die Periode der Pseudozufallssequenz verlängern. Das ist alles eine Vermutung, also zögern Sie nicht, mich zu korrigieren, wenn ich falsch liege.
bignum
Perl-Operationen nicht wirklich vertraut , ich fürchte, und ich kenne keine bestimmten Teile des obigen Programms, die ein neueres Perl erfordern. Das Interessante daran ist der Algorithmus. Versuchen Sie es in der Sprache Ihrer Wahl zu implementieren, wenn dieses Perl nicht für Sie funktioniert.
($x,$y,$circle,$not_circle)=(0,0,0);
vor der Schleife einzufügen , um sicherzustellen, dass alle Variablen definiert sind, bevor Sie sie verwenden.
(0,0,0,0)
.
($x,$y,$circle,$not_circle)=(0,0,0,0)
. Nach ein oder zwei Minuten hing es um den gewünschten Wert, dann näherte es sich 3.1409, bevor ich aufhörte. Interessant und lustig! Vielen Dank!
Sie können einen Zapfenalgorithmus für pi verwenden. Das folgende C-Programm von Dik Winter und Achim Flammenkamp wird die ersten 15.000 Stellen von pi nacheinander produzieren.
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
Einige Beispiele:
php -r "print pi();"
php -r 'echo M_PI;'
echo "<?=pi();" | php
Wenn Sie die Genauigkeit ändern möchten, versuchen Sie Folgendes:
php -d precision=100 -r 'echo pi();'
Die Größe eines Floats ist plattformabhängig, obwohl ein Maximum von ~ 1.8e308 mit einer Genauigkeit von ungefähr 14 Dezimalstellen ein üblicher Wert ist (das 64-Bit-IEEE-Format). [Weiterlesen]
Wenn Sie auf der Suche nach noch genauerer Präzision sind, finden Sie in Rosetta Code oder Code Golf SE einige Programmierlösungen.
Verwandte: Software, die PI auf mindestens tausend Stellen bei SR.SE berechnen kann
Hier ist ein Skript, das pi mit der vom Benutzer angegebenen Anzahl von Ziffern (einschließlich '.') Ausgibt.
pi.sh
#!/bin/bash
len=${1:-7}
echo "4*a(1)" | bc -l | cut -c 1-"$len"
Ausgabe
$ ./pi.sh 10
3.14159265
und mit Standardwert:
$ ./pi.sh
3.14159
Ich habe Leute gesehen, die scale
als bc
Option verwendet haben, aber in meinem Fall ( bc 1.06.95
) gibt dies nicht den richtigen Wert aus:
$ echo "scale=5;4*a(1)" | bc -l
3.14156
Beachten Sie die letzte Ziffer.
./pi.sh 10
Ausdrucke bestehen aus neun Ziffern, wobei die Initiale gezählt wird 3
. Außerdem zeigst du den Finger von Rundungsfehlern, aber deinen ./pi.sh 6
Ausgaben 3.1415
, die möglicherweise nicht optimal sind.
scale=X
Option bc
NICHT die Zahl gerundet, sondern die Zahl einfach an der X-ten Dezimalstelle abgeschnitten.
Ich mochte Abeys Antwort, aber es gefiel mir nicht, wie bc die letzte Ziffer änderte.
echo "scale=5; 4*a(1)" | bc -l
3.14156
Also habe ich scale used printf entfernt, um die Anzahl der Stellen einzustellen.
printf "%0.5f\n" $(echo "4*a(1)" | bc -l)
3.14159
printf
die Gleitkommazahlen im Vergleich zu einer strengen Einschränkung unterliegen bc
. Sie werden durch den C- double
Sprachtyp mit einer Genauigkeit von ungefähr 17 Stellen dargestellt, so dass selbst die von Null verschiedenen Stellen nach ungefähr der 17. falsch sind! ------ Ich habe eine Antwort mit korrekter Rundung des Ergebnissesprintf
hinzugefügt, die nicht durch beschränkt ist . ------ Auch um sicherzustellen, dass dieser Befehl mit verschiedenen Gebietsschemas funktioniert, müssen Sie LC_ALL=C printf
Was ist, wenn Sie sich nicht an dieses arctan
Ding erinnern können ? Oder nehmen Sie an, Sie wissen nicht einmal, dass diese Funktion in existiert bc
, und versuchen Sie, diese einfache Unterteilung auswendig zu lernen:
echo "scale=6; 355 / 113" | bc
3.141592
Funktioniert nur für 6 Stellen, aber für nicht-wissenschaftliche Berechnungen ist dies in Ordnung.
Wenn Sie glauben, dass Sie sich auch an diese beiden Zahlen nicht erinnern können, schreiben Sie zuerst den Nenner und dann den Zähler:
113 355
Oder warum nicht?
11 33 55
"double 1, double 3, double 5". Alle Zahlen sind ungerade. Teilen Sie zur Berechnung die 6-stellige Zahl erneut in zwei Hälften und tauschen Sie Nenner und Zähler, bevor Sie sie teilen. Das ist alles.
4 * arctan(1)
viel leichter, mich an diese zwei dreistelligen Zahlen zu erinnern ... Ich würde leicht 335 anstelle von 355 oder 133 anstelle von 113 verwenden.
Es kann angenommen werden, dass das OP an einem kurzen, leicht zu merkenden Shell-Befehl zum Drucken von π interessiert ist - aber die Frage sagt das nicht wirklich aus. Diese Antwort ignoriert diese Annahme und beantwortet die Frage streng wie geschrieben.
Obwohl es bereits 18 Antworten gibt, fehlt ein Ansatz - und bei so vielen Antworten könnte man meinen, dass er nicht der einzige ist, der fehlt:
Der triviale: Wie drucke ich π? Einfach π ausdrucken!
Dieser Ansatz scheint zu nutzlos zu sein, um überhaupt darüber nachzudenken, aber ich werde zeigen, dass er seine Fehler hat:
Wir würden normalerweise den Wert von π berechnen. Ich verstehe nicht, was uns davon abhält, die Lösung durch Vorausberechnung des Werts zu optimieren - es ist eine Konstante, die jeder Compiler tun würde.
Wir wollen eine Anzahl von Stellen von π, bis zu einer maximalen Genauigkeit. Wir können also einfach das Präfix der Konstanten als Text verwenden:
echo 3.1415926535897932384626433832795 | cut -b -7
3.14159
Eine Variante mit einem expliziten Argument für die Genauigkeit, z. für die Präzision 5
:
echo 3.1415926535897932384626433832795 | cut -b -$((2+5))
3.14159
Die maximale Genauigkeit kann durch Verwendung einer geeigneten Konstante, die unter Verwendung einer der anderen Antworten berechnet wird, willkürlich gewählt werden. Es ist nur durch die maximale Länge einer Befehlszeile begrenzt.
Es hat eine konstante zeitliche Komplexität, um den Wert zu finden.
Aufgrund der geringen Komplexität der Implementierung werden alle Grenzen und Einschränkungen offensichtlich.
Er handhabt eine Genauigkeit, die größer als das Maximum ist, indem er die Konstante mit der vollen verfügbaren Genauigkeit (ohne Nachlauf 0
) zurückgibt .
Diese Lösung ist zwar trivial, hat jedoch Vorteile. Es kann nützlich sein, wenn es beispielsweise in einer Shell-Funktion verwendet wird.
Die Funktionalität der obigen Lösung kann auch implementiert werden, ohne einen Prozess für cut
(vorausgesetzt, es echo
handelt sich um eine eingebaute Shell) zu erstellen. Der Befehl printf
(normalerweise ein eingebauter Befehl) wird auf etwas unklare Weise verwendet:
Die Konstante wird vollständig als Zeichenfolge behandelt (das verwendete Format %s
), es ist keine Gleitkomma-Arithmetik beteiligt, daher gelten die Grenzen von float
oder double
hier nicht.
Der Genauigkeitswert des %s
Escape-Zeichens ( 5
im folgenden Beispiel) gibt die Länge des zu druckenden Zeichenfolgepräfixes an. Hierbei handelt es sich um die Genauigkeit. Dies 3.
ist Teil des printf
Formats, um es aus der Präzisionsberechnung herauszuhalten.
$ printf "3.%.5s\n" 1415926535897932384626433832795
3.14159
Alternative mit Genauigkeit als separates Argument:
$ printf "3.%.*s\n" 5 1415926535897932384626433832795
3.14159
Oder etwas besser lesbar (Beachten Sie das Leerzeichen zwischen 3.
und 14159...
, es handelt sich um separate Argumente):
$ printf "%s%.5s\n" 3. 1415926535897932384626433832795
3.14159
Es printf
ist zu erwarten, dass die Verwendung der Variante sehr schnell ist: Da printf
es sich um eine Shell handelt, die in gängigen Shells wie bash
und eingebaut ist zsh
, werden keine Prozesse erstellt.
Es berührt auch keinen Gleitkomma-Code, sondern nur die Manipulation von Byte-Arrays (explizit keine Multibyte-Zeichen). Dies ist normalerweise schneller, oft viel schneller als die Verwendung von Gleitkommazahlen.
Häufig gibt es Gründe für die Ersetzung printf
durch /usr/bin/printf
, um die Konsistenz oder Kompatibilität zu gewährleisten. In diesem Fall, denke ich, können wir das eingebaute verwenden - was wichtig ist, da die Verwendung /usr/bin/printf
den "schnellen" Vorteil verringert, indem ein Prozess gegabelt wird.
Ein häufiges printf
Kompatibilitätsproblem ist das Ausgabeformat für Zahlen, das vom Gebietsschema abhängt. Die Trennung .
für Zahlen kann je nach ,
Gebietsschema geändert werden . Wir verwenden jedoch keine Zahlen, sondern nur eine Zeichenfolgenkonstante, die ein Literal enthält .
- unabhängig vom Gebietsschema.
StéphaneChazelas wies darauf hin, dass dies printf %.5s
anders funktioniertzsh
durch Zählen von Zeichen, nicht wie üblich von Bytes. Glücklicherweise verwenden unsere Konstanten nur Zeichen im unteren ASCII-Bereich, die in jeder relevanten Codierung mit einem Byte pro Zeichen codiert sind, sofern wir die gemeinsame UTF-8
Codierung für Unicode verwenden und keine Codierung mit fester Breite.
printf %.5s
char (nicht byte) auf zsh basiert (sinnvoll, aber gegen POSIX). ksh93
‚s %.5Ls
ist graphem basiert.