BC-自動完全精度乗算


10

高、私は任意の精度の計算機をテストする必要があり、bc比較するのに最適な基準のbcように見えますが、各乗算の結果を、関係するオペランドの最大スケールと思われるものに切り捨てます。

これをオフにする、または精度を失わないように各乗算のスケールを係数のスケールの合計に自動的に設定する簡単な方法はありますか?

これ以外bcに何かを含むよりエレガントな解決策がある場合は、共有していただければ幸いです。

例:

$ bc <<< '1.5 * 1.5'
2.2

本当の答えは2.25です。


回答:


12

引数でbc出力するスケールを制御できscale=<#>ます。

$ echo "scale=10; 5.1234 * 5.5678" | bc
28.52606652

$ echo "scale=5; 5.1234 * 5.5678" | bc
28.52606

あなたの例を使用して:

$ bc <<< 'scale=2; 1.5 * 1.5'
2.25

-lデフォルトの0ではなく、スケールを20に初期化するスイッチ(@manatworkに感謝)を使用することもできます。次に例を示します。

$ bc -l <<< '1.5 * 1.5'
2.25

$ bc -l <<< '1.52 * 1.52'
2.3104

詳細についてscaleは、bcmanページを参照してください


5
または短い:bc -l。“ -l (文字ell。)数学関数を定義し、スケールをデフォルトのゼロではなく20に初期化する” bc仕様
manatwork

@manatwork-ありがとう、その切り替えに気づかなかった。
slm

ありがとう。スケールを2147483647(たまたまINT_MAXに等しい)に設定できたと思いますが、これは、設定可能な最大スケール値であることをbcが教えてくれます(テストではこれまでのところgointです)。整数でのみテストし、ダイナミック長の数値を使用することによるパフォーマンス上の利点をbcに与えます。
PSkocik 2013年

1
BCの乗算のために、結果のスケールは正確にmin(max(sx,sy,scale),sx+sy)どこsxsyのスケールですxyの中でx*y。設定scale=scale(x)+scale(y)により、必要な最大精度が得られます。スケールを大きい数値(1000など)に設定しても、結果のスケールは増加しません。スケール変数はsにのみ直接影響します。除算の結果scale=1000; a/1は、前のスケールが何であっても、(ドットの後の)10進1000桁の結果を作成します。
アイザック

1

これを試して :

$ bc
scale=10
1.5 * 1.5
2.25

スケール変数についてbcの人を検索


0

末尾のゼロを表示しないこのbash関数を作成しました

calc () { MAX_PRECISION=20; bc <<< "scale=$MAX_PRECISION; scale = scale($@); $@"; }

例:calc 1.25^3= 1.953125

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.