どのコマンドでpiを出力できますか?印刷する桁数を指定したいのですが、オンラインでは何も見つかりませんでした。piを印刷したいだけです。
どのコマンドでpiを出力できますか?印刷する桁数を指定したいのですが、オンラインでは何も見つかりませんでした。piを印刷したいだけです。
回答:
次のコマンドを使用できます。
echo "scale=5; 4*a(1)" | bc -l
3.14159
ここで、scaleは小数点以下の桁数です。
参考:http : //www.tux-planet.fr/calculer-le-chiffre-pi-en-ligne-de-commande-sous-linux/
bash
ここの文字列をサポートする短いバージョンと他のシェル:bc -l <<< "scale=5; 4*a(1)"
。
scale=1000
999桁の正確な数字をかなり迅速に返します(pi / 4を計算してから4を掛けているため、最後の桁は1オフです)。scale=4000
数秒で4000の正しい数字を与えます。scale=10000
私が我慢するよりも時間がかかりますが、おそらく9999または10000の正しい数字を与えます。
tex(1)
インストール済みの場合:
tex --version | head -1 | cut -f2 -d' '
cut
。長い時間待ってからコマンドを再実行すると、より多くの数字を出力できます。
任意の精度で印刷するbc
には、次の式を使用できますpi = 4*atan(1)
。
# bc -l
scale=<your precision>
4*a(1)
scale
オプションは、pi = 3.141592..
しかし、とecho "scale=5; 4*a(1)" | bc -l => 3.14156
私はそれから見ることを期待しますか3.14159
?
scale
計算に使用する精度を指定します。そのscale=5
ため、アトミック操作で5桁を超える小数桁を使用する操作はありません。
πの値を計算できるものが必要な場合は、いくつかのアプローチがあります。おそらく最も明白な解決策は、pi
(Debianパッケージリンク)のような既製のパッケージを使用することです。これは、Debianのパッケージの説明を信頼する場合、メモリによってのみ制限される任意の精度で値を計算できます。
pi
実際には、CLNライブラリ(Numbersのクラスライブラリ)に含まれている例です。Pi、フィボナッチなど、任意の長さの数字を生成するツールを提供するサンプルアプリケーションが含まれています。CLNパッケージは、Debian / Ubuntuにあらかじめパッケージされています(上記のDebianリンクが指しているものです)。
$ ./pi 10
3.141592653
$ ./pi 20
3.1415926535897932384
注:これらの例のソースは、CLNコードベースのソースにあります。
Fedoraでは、ソースtarballをダウンロードして自分でビルドしなければなりませんでしたが、ビルドは少し手間がかかりません。なんらかの理由で、cln
Fedora のパッケージにはライブラリだけが含まれていますが、Debian / Ubuntuバージョン(上記)で利用可能な例は無視しています。
Archはパッケージで同じプログラムを提供していcln
ます(Amphiteótに感謝)。
pi
は、まさにあなたが探しているもののように聞こえます。pi 300
たとえば、最初の300桁を印刷するなどのことができます。
最大100万桁の場合、次を使用できます(ここでは3000桁)。
curl --silent http://www.angio.net/pi/digits/pi1000000.txt | cut -c1-3000
cut
終了してパイプが壊れたらダウンロードを停止するのに十分な場合を除きますか?その場合は、O(n)になります。
他の回答の一部では、出力の最後の場所に誤った数字が表示されます。以下は、使用方法のbc
バリエーションですが、結果は正しく丸められています。変数にs
は、有効桁数(3
小数点の前を含む)が含まれます。
$ 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
丸めはで直接実行されbc
ます。これには、有効桁数が約17桁の数値にprintf
C言語double
タイプ表現を使用するコマンドの制限はありません。丸めの答えをprintf
参照してください。
scale=s-1
切り捨てる桁数を設定します。pi/1
結果を1で除算して、切り捨てを適用します。Simple pi
は、数値を切り捨てません。
半分に切り上げるには、切り捨てられる最初の桁に5を追加する必要があり(5×10 -s)、5より大きい数字の場合、残っている最後の桁が増分されます。
hobbsによるテストから、丸められたり切り捨てられたりする3つの追加の数字(scale=s+2
)は、非常に長い数字でも十分であるようです。
使用上の例ここでは、文字列の例でサポートされているbash
、ksh
とzsh
。シェルがここで文字列の使用echo
とパイプをサポートしていない場合:
$ echo "s=5; scale=s+2; pi=4*a(1); scale=s-1; pi/1" | bc -l
3.1415
python2の場合:
$ python -c "import math; print(str(math.pi)[:7])"
3.14159
(..)
これはPython 2および3で機能します。12桁しかないようです。
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)
、数百万桁のほんの数秒でした。悪くない、全く !!!。
bashの場合:
$ read -a a <<< $(grep M_PIl /usr/include/math.h) ; echo ${a[3]} | tr -d L
3.141592653589793238462643383279502884
afmtodit
する必要groff
があります。ここでUbuntu(およびフレーバー)では、標準ではありません。JFYI。
組み込みのpi()関数を使用したPHPでは非常に簡単です。
<?php
echo round(pi(), 2);
?>
どうやってこの質問を見逃したのですか...
ここに私はスタックオーバーフローに数週間前に投稿されていること私の少しのPythonパイプログラムです。特に高速というわけではありませんが、多くの桁を実行できます。:)しかし、そのスレッドで述べたように、私は通常、任意精度の計算にPythonのmpmathモジュールを使用し、mpmathにはかなり高速なpiマーカーがあります。
例えば、
time python -c "from mpmath import mp;mp.dps=500000;print mp.pi" >bigpi
real 0m4.709s
user 0m4.556s
sys 0m0.084s
5秒未満のpiの500000は、あまりにも粗末ではありません、シングルコア2GHzプロセッサ、2ギガバイトのRAM、および古いIDEドライブへの書き込みを備えたマシンで実行されていることを考えると、私見です。
from mpmath import mp; mp.dps = 1000000 ; print(mp.pi)
(pip3のインストールmpmathの後)2秒間で100万桁を試してください。悪くない、全く !!!。
node.js
インストール済みの場合、これはpiを見つけるのに最善を尽くしますが、その最善はあまり良くありません:
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)'
サンプル出力:
3.14157749
3.1416426
3.14159055
3.14171554
3.14176165
3.14157587
3.14161137
3.14167685
3.14172371
node -e 'console.log(Math.PI)'
がベストよりも少し良くなります。
echo pie
?
モンテカルロ法
たとえば、このメソッドの説明については、これを参照してください。
注意事項
長所
楽しい:-)
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
}'
注:最初に試してみましたsrand
が、動かなくなってしまい、3.14
その後の数字は振動し続け、収束することはありませんでした。これはおそらく、しばらくしてPRNGが繰り返し始めたためです。の使用は、それsrand
を回避するか、少なくとも擬似ランダムシーケンスの期間を延長します。これはすべて推測であるため、間違っている場合は修正してください。
bignum
、Perl での操作にあまり精通していません。恐れています。新しいプログラムを必要とする上記のプログラムの特定の部分を知りません。とにかく、これについて興味深いのはアルゴリズムそのものです。このPerlが機能しない場合は、選択した言語で実装してみてください。
($x,$y,$circle,$not_circle)=(0,0,0);
ループの前に追加して、使用する前にすべての変数が定義されていることを確認できます。
(0,0,0,0)
です。
($x,$y,$circle,$not_circle)=(0,0,0,0)
。1〜2分後に、目的の値にぶら下がっていたので、停止する前に3.1409にかなり近づきました。面白くて楽しい!ありがとうございました!
piにはスピゴットアルゴリズムを使用できます。Dik WinterとAchim Flammenkampによる次のCプログラムは、最初の15,000桁のpiを一度に1桁生成します。
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
いくつかの例:
php -r "print pi();"
php -r 'echo M_PI;'
echo "<?=pi();" | php
精度を変更したい場合:
php -d precision=100 -r 'echo pi();'
浮動小数点数のサイズはプラットフォームに依存しますが、約14桁の10進数の精度を持つ最大1.8e308が一般的な値です(64ビットIEEE形式)。[続きを読む]
さらに正確な精度を探している場合は、Rosetta CodeまたはCode Golf SEでプログラミングソリューションを確認してください。
関連:SR.SE でPIを少なくとも1000桁まで計算できるソフトウェア
これは、ユーザーが指定した桁数( '。'を含む)でpiを出力するスクリプトです。
pi.sh
#!/bin/bash
len=${1:-7}
echo "4*a(1)" | bc -l | cut -c 1-"$len"
出力
$ ./pi.sh 10
3.14159265
そしてデフォルト値で:
$ ./pi.sh
3.14159
オプションscale
として使用している人を見てきましたbc
が、私の場合(bc 1.06.95
)、これは正しい値を出力しません:
$ echo "scale=5;4*a(1)" | bc -l
3.14156
最後の数字に注意してください。
./pi.sh 10
の頭文字を数えて9桁を印刷します3
。また、丸め誤差の指を指していますが、./pi.sh 6
出力3.1415
は最適ではない可能性があります。
scale=X
オプションはbc
数値を丸めませんが、X桁の10進数で数値を切り捨てます。
Abeyの答えは好きですが、bcが最後の桁を変更するのが好きではありませんでした。
echo "scale=5; 4*a(1)" | bc -l
3.14156
そこで、printfを使用して桁数を設定するスケールを削除しました。
printf "%0.5f\n" $(echo "4*a(1)" | bc -l)
3.14159
printf
に比べて浮動小数点数に厳しい制限があるためbc
です。これらは 約17桁の精度を持つC言語double
タイプで表されるため、約17 桁目以降のゼロ以外の数字も偽物です!------私は、によって制限されない結果の正しい丸めで答えをprintf
追加しました。:------また、このコマンドは、あなたがこのような何かをしなければならない様々なロケールで動作することを保証するためにLC_ALL=C printf
...
このarctan
ことを自分の人生で思い出せない場合はどうしますか?またはbc
、この関数がに存在することさえ知らないとしたら、この単純な区分を暗記してみてください:
echo "scale=6; 355 / 113" | bc
3.141592
6桁でのみ機能しますが、非科学的な計算ではこれで問題ありません。
これらの2つの数値を思い出せない場合は、最初に分母を、次に分子を記述します。
113 355
またはどうして
11 33 55
「ダブル1、ダブル3、ダブル5」。すべての数字は奇妙です。計算するには、6桁の数字を再び半分に分割し、分母と分子を交換してから分割します。それについてです。
4 * arctan(1)
私は簡単に113の代わりに335の代わりに、355、または133を使用したい...その2の三桁の数字を覚えておくことが非常に簡単に
OPは、πを出力するための短くて覚えやすいシェルコマンドに関心があると仮定できますが、質問は実際にはそうではありません。この答えはその仮定を無視しており、書かれているとおりに質問に厳密に答えています。
すでに18の答えがありますが、1つのアプローチがまだありません。そして、非常に多くの答えがあるので、欠けているのはそれだけではないと考えることができます
。πを印刷するだけです!
このアプローチは、考えることすら役に立たないようですが、メリットがあることを示します。
通常、πの値を計算します。値を事前に計算することで、ソリューションの最適化を妨げている原因はわかりません。これは定数であり、どのコンパイラーもそれを行います。
最大精度までのπの桁数が必要です。したがって、テキストのように定数のプレフィックスを取得できます。
echo 3.1415926535897932384626433832795 | cut -b -7
3.14159
精度の明示的な引数を持つバリアント。精度のために5
:
echo 3.1415926535897932384626433832795 | cut -b -$((2+5))
3.14159
最大精度は、他の回答のいずれかを使用して計算された適切な定数を使用して、任意に選択できます。コマンドラインの最大長によってのみ制限されます。
値を見つけるために一定の時間の複雑さがあります。
実装の複雑さが低いため、すべての制限と制約が明確になります。
定数を使用可能な完全な精度(末尾なし0
)で返すことにより、最大値よりも大きい精度を適切に処理します。
そのため、このソリューションは簡単ですが、利点があります。たとえば、シェル関数で使用する場合に役立ちます。
上記のソリューションの機能は、プロセスを作成せずに実装することもできますcut
(echo
シェルの組み込みを想定)。これは、コマンド使用printf
幾分不明瞭な方法で(通常は組み込みの)
定数は完全に文字列(フォーマット用途としてhandeledさ%s
)の限界に、arithmethic関与しない浮動小数点は、存在しないfloat
か、がdouble
ここでは適用されません。エスケープ
の精度値%s
(5
以下の例)は、印刷する文字列プレフィックスの長さを指定します-これは精度です。3.
一部であり、printf
精密な計算のそれを維持する形式。
$ printf "3.%.5s\n" 1415926535897932384626433832795
3.14159
別の引数として精度を使用する代替:
$ printf "3.%.*s\n" 5 1415926535897932384626433832795
3.14159
または、もう少し読みやすくします(3.
との間のスペースに注意してください14159...
)
$ printf "%s%.5s\n" 3. 1415926535897932384626433832795
3.14159
を使用printf
するバリアントprintf
は、非常に高速であることが期待できます。bash
とのような一般的なシェルに組み込まれたシェルであるzsh
ため、プロセスは作成されません。
また、浮動小数点関連のコードには一切触れず、バイト配列の操作のみに触れます(明らかにマルチバイト文字には触れません)。これは通常、高速であり、多くの場合、浮動小数点の使用よりはるかに高速です。
多くの場合、交換する理由がある printf
ことにより、 /usr/bin/printf
保証の整合性や互換性には。この場合、ビルトインを使用できると思います-これは重要/usr/bin/printf
です。使用すると、プロセスをフォークすることで「高速」の利点が減少するためです。互換性
に関する一般的な問題printf
は、ロケールに依存する数値出力形式です。.
数字の区切りは,
、ロケール設定に基づいて変更できます。ただし、数字は使用せず、リテラルを含む文字列定数のみを使用.
します。ロケールの影響は受けません。
StéphaneChazelasはprintf %.5s
、zsh
、通常のバイトではなく文字をカウントします。幸いなことに、UTF-8
固定幅エンコードではなく、Unicode の共通エンコードを使用する限り、定数は関連するエンコードで文字ごとに1バイトでエンコードされる下位ASCII範囲の文字のみを使用します。
printf %.5s
はzshベースのchar(バイトではない)であることに注意してください(賢明ですが、POSIXに対して)。ksh93
さんは%.5Ls
graphem基づいています。