awkはなぜ合計をゼロにしませんが、非常に小さい数字にしますか?

awkはなぜ合計をゼロにしませんが、非常に小さい数字にしますか?

このファイルがありますが、最初の列のすべての数字を合計したいと思います。単純な:

awk '{s+=$1;print $1,s}' file
0.1048 -1.2705
0.4196 -0.8509
0.4196 -0.4313
0.2719 -0.1594
0.0797 -0.0797
0.0797 -5.55112e-17   #Notice this line

ご存じのように、最後の値はゼロでなければなりません。私はそれがe-17ゼロであることを知っていますが、時々出力はまさにゼロです。 0以外の場合、出力は負の記号または正の記号で表されるe-15範囲内にあります。e-17この問題を解決するには絶対値を使用する必要があります。

awk '{s+=$1;if (sqrt(s^2)<0.01) s=0;print $1,s}' file

なぜこれが起こるのか知っていますか?

ベストアンサー1

これは、コンピュータが数値を処理するときに精度が制限されているために発生します。そして、利用可能な精度はバイナリ形式を使用して数値を表します。

これにより、私たちの10進法では、マイナーに見える数字は近似値でのみ表現されます(参照:ウィキペディアアイテムこの目的のために): 例えば0.1(例えば1/10) は、実際には0.100000001490116119384765625コンピュータにあるものと同様に保存されます。

したがって、すべての電話番号は実際には単一の電話番号として扱われます。近似する(運が良くなく、0.5そのような数字が表すことができる数字がある場合は除く)正確に)。

これらのおおよその数字をすべて追加すると、最終的にエラーが発生する可能性があります!= 0

おすすめ記事