どのコマンドで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/
tex(1)
がインストールされている場合:
tex --version | head -1 | cut -f2 -d' '
任意の精度で印刷するには、bc
と式pi = 4*atan(1)
を使用できます。
# bc -l
scale=<your precision>
4*a(1)
100万桁までは、以下を使用できます(ここでは3000桁)。
curl --silent http://www.angio.net/pi/digits/pi1000000.txt | cut -c1-3000
他の回答の一部は、出力の最後の場所に誤った数字を示しています。以下は 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
で直接実行されます。これには、C言語を使用するコマンドprintf
の制限はありません double
type 約17桁の精度を持つ数値の表現。 printf
丸め付きの回答 を参照してください。
scale=s-1
は、切り捨てる桁数を設定します。 pi/1
は、結果を1で割り、切り捨てを適用します。単純な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
Perlの1行( bignum を使用):
Perl -Mbignum=bpi -wle 'print bpi(NUM)'
例えば
Perl -Mbignum=bpi -wle 'print bpi(6)'
3.14159
Python2の場合:
$ python -c "import math; print(str(math.pi)[:7])"
3.14159
Rubyの使用:
require "bigdecimal"
require "bigdecimal/math"
include BigMath
BigDecimal(PI(100)).round(9).to_s("F")
3.141592654
バッシュで:
$ read -a a <<< $(grep M_PIl /usr/include/math.h) ; echo ${a[3]} | tr -d L
3.141592653589793238462643383279502884
PHP組み込みのpi()関数を使用して、非常に単純です:
<?php
echo round(pi(), 2);
?>
どのようにしてこの質問を逃した...
ここ 'ささいなPython数週間前にスタックオーバーフローに投稿した私のpiプログラムです。特に高速ではありませんが、実行できますlotsof digits。:)ただし、そのスレッドで述べたように、私は通常、任意精度の計算に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の小数は、シングルコアの2 GHzプロセッサ、2ギガのRAMを搭載したマシンで実行していて、年配のIDEドライブに書き込む。
[〜#〜] 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 を確認してください。
関連: PIを少なくとも1000桁まで計算できるソフトウェア at SR.SE
Piにはスピゴットアルゴリズムを使用できます。 Dik WinterとAchim Flammenkampによる次のCプログラムは、piの最初の15,000桁を一度に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;}
あなたが持っている場合 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
モンテカルロ法
たとえば、このメソッドの説明については this を参照してください。
注意事項
利点
楽しい:-)
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
を使用すると、それが回避されるか、少なくとも疑似ランダムシーケンスの期間が長くなります。これはすべての推測なので、私が間違っている場合は自由に修正してください。
OPは、πを出力するためのシェルコマンドを覚えやすく、短くすることに関心があると想定できますが、質問では実際にはそうは言えません。この答えはその仮定を無視しており、書かれたとおりに質問に厳密に答えます;
すでに18の回答がありますが、1つのアプローチがまだありません。非常に多くの回答があるため、不足しているのはそれだけではないと考えるかもしれません。
簡単なもの:πを出力する方法ちょうどπを印刷!
そのアプローチはあまりにも役に立たないように思えますが、メリットがあることを示します。
通常、πの値を計算します。値を事前に計算してソリューションを最適化できない理由はわかりません。これは定数なので、どのコンパイラでも実行できます。
最大精度まで、πの桁数が必要です。したがって、定数の接頭辞をテキストとして取得できます。
echo 3.1415926535897932384626433832795 | cut -b -7
3.14159
精度の明示的な引数を持つバリアント。精度5
:
echo 3.1415926535897932384626433832795 | cut -b -$((2+5))
3.14159
最大精度は、他の回答の1つを使用して計算された適切な定数を使用することにより、任意に選択できます。コマンドラインの最大長によってのみ制限されます。
それは価値を見つけるために一定の時間の複雑さを持っています。
実装の複雑さが低いことに基づいて、すべての制限と制約が明らかになります。
使用可能な最大の精度で定数を返すことにより、最大値よりも大きい精度を適切に処理します(末尾に0
はありません)。
そのため、このソリューションには些細なことですが、利点があります。たとえば、Shell関数で使用すると便利です。
上記のソリューションの機能は、cut
のプロセスを作成せずに補完することもできます(echo
はシェルの組み込みであると想定)。コマンドprintf
(通常は組み込み)をややあいまいな方法で使用します。
定数は文字列として完全に処理されます(形式は%s
を使用します)。浮動小数点演算は含まれていないため、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
では通常どおりバイトではなく文字をカウントすることで異なる動作をすることを指摘しました。幸いなことに、Unicodeに共通のUTF-8
エンコーディングを使用し、固定幅エンコーディングを使用しない限り、定数はASCII範囲の下位の文字のみを使用します。
もしあなたがあなたの人生のためにこのarctan
のことを思い出せないならどうしますか?または、この関数がbc
に存在することさえ知らない場合は、この単純な除算を覚えてみてください。
echo "scale=6; 355 / 113" | bc
3.141592
6桁でのみ機能しますが、非科学的な計算ではこれで十分です。
これら2つの数値も思い出せない場合は、最初に分母を書き、次に分子を書きます。
113 355
またはなぜしない
11 33 55
「ダブル1、ダブル3、ダブル5」。すべての数字は奇妙です。計算するには、6桁の数値を再び半分に分割し、分母と分子を交換してから除算します。それだけです。
これは、ユーザーが指定した桁数(「。」を含む)で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
最後の桁に注意してください。
私はアベイの答えが好きですが、bcが最後の桁をどのように変更しているかは気に入らなかった。
echo "scale=5; 4*a(1)" | bc -l
3.14156
そのため、桁数を設定するためにprintfを使用していたスケールを削除しました。
printf "%0.5f\n" $(echo "4*a(1)" | bc -l)
3.14159