5

浮動小数点計算awkを実行中の の動作に驚いています。テーブルデータの計算が間違っていました。

$ awk 'BEGIN {print 2.3/0.1}'
23  <-- Ok
$ awk 'BEGIN {print int(2.3/0.1)}'
22  <-- Wrong!

$ awk 'BEGIN {print 2.3-2.2==0.1}'
0   <-- Surprise!
$ awk 'BEGIN {print 2.3-2.2>0.1}'  <-- Din't produce any output :(
$ awk 'BEGIN {print 2.3-2.2<0.1}'
1   <-- Totally confused now ...

誰かがここで何が起こっているかについて光を当てることができますか?

編集1

@fedorquiが指摘したように、最後から 2 番目のコマンドの出力は、リダイレクト演算子 ( > ) のために0.1という名前のファイルに移動します。

では、大なり( > ) 操作を実行するにはどうすればよいですか?

それに対する解決策は@fedorquiによっても提供されています

$ awk 'BEGIN {print (2.3-2.2>0.1)}'
0  <-- Wrong!
4

1 に答える 1

9

マニュアルの次のセクションは、観察している問題を理解するのに役立ちます。

15.1.1.2 浮動小数点数は抽象数ではない

抽象的な意味での数値 (高校や大学の算数で学んだことなど) とは異なり、コンピューターに格納される数値には一定の制限があります。それらは無限の桁数を表すことはできず、常に物事を正確に表すこともできません。特に、浮動小数点数は常に値を正確に表すことができるとは限りません。以下に例を示します。

 $ awk '{ printf("%010d\n", $1 * 100) }'
 515.79
 -| 0000051579
 515.80
 -| 0000051579
 515.81
 -| 0000051580
 515.82
 -| 0000051582
 Ctrl-d

これは、一部の値は正確に表すことができますが、他の値は概算にすぎないことを示しています。これは awk の「バグ」ではなく、単にコンピューターが数値を表現する方法のアーティファクトです。


強くお勧めする読み物:

What every computer scientist should know about floating-point arithmetic

于 2013-10-29T11:23:53.573 に答える