awk算術はexprとは異なります

awk算術はexprとは異なります

awk算術とexprの間には対照的な出力があります。

はい

expr 11111111111111111111 / 22

与えられた

505050505050505050

しかし、awkの場合:

echo '11111111111111111111' | awk '{q=$1/22;;print q}'

与えられた

505050505050505024

誰かがこれを説明できますか?

答え1

おそらくあなたのawk仕事はGNU awkのように浮動小数点値を使って動作します。

$ gawk 'BEGIN{ a = 11111111111111111111; print a, a/22; }'
11111111111111110656 505050505050505024

正確に保存することはできず、11111111111111111111残り(11111111111111111111 / 22is 505050505050505029.81...)も正確に保存することはできません。

数値の範囲がexpr広いようです。私のものはそうではありません(GNU coreutils 8.26のもの):

$ expr 11111111111111111111 / 22
expr: 11111111111111111111: Numerical result out of range

〜のように@スチールドライバコメント、現在のバージョンGNU awkはまた、次のことができます。使用GNU MPFRライブラリ高精度演算に使用されます。たとえば、4倍精度の浮動小数点数は、次の除算に対する正確な答えを提供するのに十分です。

$ gawk -M -v PREC="quad" -v OFMT="%.6f" \
  'BEGIN{ a = 11111111111111111111; print a, a/22; }'
11111111111111111111 505050505050505050.500000

それに加えて、bcPythonは任意の大きな数字で使用できます。

関連情報