我对执行浮点计算时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 所指出的,由于重定向运算符(&gt; ),第二个最后一个命令的输出转到名为 0.1 的文件。
那么我应该如何执行大于(&gt; )的操作?
@fedorqui
也提供了解决方案$ awk 'BEGIN {print (2.3-2.2>0.1)}'
0 <-- Wrong!
答案 0 :(得分:9)
manual中的以下部分可以帮助您了解您正在观察的问题:
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中的“bug”,而只是一个 计算机如何表示数字的神器。
强烈推荐阅读:
What every computer scientist should know about floating-point arithmetic