BCを使う

BCを使う

私はしばしばawk(gawk)電卓を使います。

calc(){ awk "BEGIN{ print $* }" ;}

Ubuntu 14.04では、標準形式で大きな数字を出力します。

$ calc 56777654409823*4674990588446667952594759939814064128
2.65435e+50

ただし、現在(Ubuntu 15.10)の出力は標準形式ではなくなりました。

$ calc 56777654409823*4674990588446667952594759939814064128
265434999999999985120999032855606532558652107128832

何が変わりましたか?出力が標準形式かどうかを選択する方法はありますか?

答え1

代わりにprintfを使用してください。

calc(){ awk "BEGIN{ printf (\"%.5e\\n\", $*) }" ;}

答え2

awkの答えで見ることができるほとんどは騒音です。

bcこの数値は、任意の精度計算を実行するように設計された小さなユーティリティ(約80kByte)と比較できます。

$ calc(){ awk "BEGIN{print $*}"; }
$ math='56777654409823*4674990588446667952594759939814064128'
$ bc <<<"$math"; calc "$math"
265434999999999978394292482412066060207814915129344
265434999999999985120999032855606532558652107128832

2654349999999999978394292482412066060207814915129344 265434999999999985120999032855606532558652107128832

唯一一致する数字は、倍精度(64ビット)浮動小数点演算の精度である最初の16個の10進数です。

はい、gawkは任意の正確な数学演算を実行できます。コンパイル済みプログラム入力そしてプログラム名はそれらに従ってくださいオプション。

  • --versionに「GNU MPFRとGNU MP」が含まれていることを確認してください。

    gawk --version
    -| GNU Awk 4.1.2, API: 1.1 (GNU MPFR 3.1.0-p3, GNU MP 5.0.2)
    -| Copyright (C) 1989, 1991-2015 Free Software Foundation.
    
  • このオプションを使用してgawkを呼び出します-M

    読む15.5 gawkを使用した任意精度整数演算

gawkに電話する必要があります。

calc(){ awk -M "BEGIN{print $*}"; }     

複数の詳細を確認するために awk または gawk を使用する代わりに、以下を使用してください。


BCを使う

bc は、任意の精度で数学的計算を実行するユーティリティです。

bc <<<'56777654409823*4674990588446667952594759939814064128'
265434999999999978394292482412066060207814915129344

パイを200桁(1のアークタンジェントの4倍)で計算します。

$ bc <<<"scale=200;4*a(1)"
3.141592653589793238462643383279502884197169399375105820974944592307\
81640628620899862803482534211706798214808651328230664709384460955058\
223172535940812848111745028410270193852110555964462294895493038196

実際の計算を使用してください:

関数を定義した後に以下を作成すると、次のリストが表示されます。

$ type -a calc
calc is a function
calc () { awk -M "BEGIN{print $*}"; }
calc is /usr/bin/calc

関数の定義を解除するだけです。

$ unset -f calc
$ type calc
calc is /usr/bin/calc

そこにすることができます:

$ calc '2* 3'
6

$ calc '2 ^ 127 - 1'   # mersene prime.
170141183460469231731687303715884105727

$ calc '56777654409823*4674990588446667952594759939814064128'
         265434999999999978394292482412066060207814915129344

これはbcの答えとまったく同じです。

$ math='56777654409823*4674990588446667952594759939814064128'
$ bc <<<"$math"; echo $(calc "$math")
265434999999999978394292482412066060207814915129344
265434999999999978394292482412066060207814915129344

関連情報