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所指出的,由于重定向运算符 ( > ) ,倒数第二个命令的输出会转到名为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 回答