web-dev-qa-db-ja.com

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

Awk算術演算とexprの間にいくつかのコントラスト出力があります。

expr 11111111111111111111 / 22

与える

505050505050505050

しかしawkで:

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

与える

505050505050505024

誰かが説明できますか?

1
user305910

おそらく、あなたのawkは、GNU awkが行うように見えるような浮動小数点値で機能します。

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

11111111111111111111を正確に格納できず、余りも正確に格納できません(11111111111111111111 / 22505050505050505029.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は、任意の大きな数に使用できます。

5
ilkkachu