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