awk中的浮点计算

时间:2013-10-29 11:04:13

标签: awk floating-point

我对执行浮点计算时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!

1 个答案:

答案 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