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 / 22
is 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
それに加えて、bc
Pythonは任意の大きな数字で使用できます。