Awk算術演算とexprの間にいくつかのコントラスト出力があります。
例
expr 11111111111111111111 / 22
与える
505050505050505050
しかしawkで:
echo '11111111111111111111' | awk '{q=$1/22;;print q}'
与える
505050505050505024
誰かが説明できますか?
おそらく、あなたのawk
は、GNU awkが行うように見えるような浮動小数点値で機能します。
$ gawk 'BEGIN{ a = 11111111111111111111; print a, a/22; }'
11111111111111110656 505050505050505024
11111111111111111111
を正確に格納できず、余りも正確に格納できません(11111111111111111111 / 22
は505050505050505029.81...
です)。
expr
の数値範囲が広いようです。私はしません(GNU coreutils 8.26)からのもの):
$ expr 11111111111111111111 / 22
expr: 11111111111111111111: Numerical result out of range
@ steeldriver のコメントとして、 GNU awkの現在のバージョンにも機能があります 高精度の演算に GNU MPFRライブラリ を使用します。たとえば、四倍精度浮動小数点数は、この除算に正確な答えを与えるのに十分です。
$ gawk -M -v PREC="quad" -v OFMT="%.6f" \
'BEGIN{ a = 11111111111111111111; print a, a/22; }'
11111111111111111111 505050505050505050.500000
それ以外は、bc
またはPythonは、任意の大きな数に使用できます。