web-dev-qa-db-ja.com

pi(3.14159)を印刷するにはどうすればよいですか?

どのコマンドでpiを出力できますか?印刷する桁数を指定したいのですが、オンラインで何も見つかりませんでした。私はpiを印刷できるようにしたいだけです。

35
DisplayName

次のコマンドを使用できます。

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/

52
Abey

tex(1)がインストールされている場合:

tex --version | head -1 | cut -f2 -d' '
62
Steven D

任意の精度で印刷するには、bcと式pi = 4*atan(1)を使用できます。

# bc -l
scale=<your precision>
4*a(1)
23
Abrixas2

100万桁までは、以下を使用できます(ここでは3000桁)。

curl --silent http://www.angio.net/pi/digits/pi1000000.txt | cut -c1-3000
17
Anthon

他の回答の一部は、出力の最後の場所に誤った数字を示しています。以下は 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)で十分であるようです。

ここで文字列

上記の例では ここでは文字列 を使用しています。これは、たとえばbashkshzshでサポートされています。シェルがここで文字列をサポートしていない場合は、代わりにechoとパイプを使用します。

$ echo "s=5; scale=s+2; pi=4*a(1); scale=s-1; pi/1" |  bc -l
3.1415
15
pabouk

Perlの1行( bignum を使用):

Perl -Mbignum=bpi -wle 'print bpi(NUM)'

例えば

Perl -Mbignum=bpi -wle 'print bpi(6)'
3.14159
12
don_crissti

Python2の場合:

$ python -c "import math; print(str(math.pi)[:7])"
3.14159
9
mkc

Rubyの使用:

require "bigdecimal"
require "bigdecimal/math"
include BigMath

BigDecimal(PI(100)).round(9).to_s("F")

3.141592654
7
SteM

バッシュで:

$ read -a a <<< $(grep M_PIl /usr/include/math.h) ; echo ${a[3]} | tr -d L
3.141592653589793238462643383279502884
4
Edouard Thiel

PHP組み込みのpi()関数を使用して、非常に単純です:

<?php 
echo round(pi(), 2);
?>
3
Mark Farnell

どのようにしてこの質問を逃した...

ここ 'ささいな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ドライブに書き込む。

3
PM 2Ring

[〜#〜] 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

2
kenorb

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;}
2

あなたが持っている場合 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
2
Paul

モンテカルロ法

たとえば、このメソッドの説明については 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を使用すると、それが回避されるか、少なくとも疑似ランダムシーケンスの期間が長くなります。これはすべての推測なので、私が間違っている場合は自由に修正してください。

2
Joseph R.

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を使用するバリアントは非常に高速であることが期待できます。printfbashzshなどの一般的なシェルに組み込まれたシェルであるため、作成されません任意のプロセス。
また、浮動小数点関連のコードには触れず、バイト配列の操作(明示的にマルチバイト文字ではない)のみを扱います。これは通常、浮動小数点を使用するよりも高速で、多くの場合はるかに高速です。

printfの互換性

多くの場合、一貫性または互換性を保証するためにprintf/usr/bin/printfに置き換える理由があります。この場合、ビルトインを使用できると思います。これは重要です。/usr/bin/printfを使用すると、プロセスをフォークすることで "高速"の利点が減少するためです。
printf互換性の一般的な問題は、ロケールに応じた数値出力形式です。数値を区切る.は、ロケール設定に基づいて,に変更できます。ただし、数値は使用せず、リテラル.を含む文字列定数のみを使用します-ロケールの影響を受けません。
StéphaneChazelasは、printf %.5szshでは通常どおりバイトではなく文字をカウントすることで異なる動作をすることを指摘しました。幸いなことに、Unicodeに共通のUTF-8エンコーディングを使用し、固定幅エンコーディングを使用しない限り、定数はASCII範囲の下位の文字のみを使用します。

1
Volker Siegel

もしあなたがあなたの人生のためにこのarctanのことを思い出せないならどうしますか?または、この関数がbcに存在することさえ知らない場合は、この単純な除算を覚えてみてください。

echo "scale=6; 355 / 113" | bc
3.141592

6桁でのみ機能しますが、非科学的な計算ではこれで十分です。

これら2つの数値も思い出せない場合は、最初に分母を書き、次に分子を書きます。

113 355

またはなぜしない

11 33 55

「ダブル1、ダブル3、ダブル5」。すべての数字は奇妙です。計算するには、6桁の数値を再び半分に分割し、分母と分子を交換してから除算します。それだけです。

1
syntaxerror

これは、ユーザーが指定した桁数(「。」を含む)で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

scalebcオプションとして使用している人を見てきましたが、私の場合(bc 1.06.95)これは正しい値を出力しません:

$ echo "scale=5;4*a(1)" | bc -l
3.14156

最後の桁に注意してください。

1
fduff

私はアベイの答えが好きですが、bcが最後の桁をどのように変更しているかは気に入らなかった。

echo "scale=5; 4*a(1)" | bc -l
3.14156

そのため、桁数を設定するためにprintfを使用していたスケールを削除しました。

printf "%0.5f\n" $(echo "4*a(1)" | bc -l)
3.14159
1
LinuxGuru