2013-10-29 157 views
4

我对awk的行为感兴趣,同时执行浮点数的计算。它导致我对表格数据进行错误的计算。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 ... 

有人可以指出什么在这里?

EDIT 1

正如指出由@fedorqui,第二最后一个命令的输出变为文件名为0.1因为重定向操作符(>)的。

那么我该如何执行大于>)的操作?

解决它也被@fedorqui

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

+1有趣的问题。我发现了一些信息 - > http://www.gnu.org/software/gawk/manual/html_node/Floating-Point-Issues.html还要注意'awk'BEGIN {print 2.3-2.2> 0.1}''写道名称为'0.1'的文件中'2.3-2.2'的结果。 – fedorqui

+0

@fedorqui我也搜索了这个话题。他们所说的只是预料之外的行为!我该如何准确解决我的问题?我尝试用'perl'解决问题,但不幸的是,它也可能以不同的方式行事。 – jkshah

+0

@fedorqui感谢您指出。我用更新查询更新了问题! – jkshah

回答

8

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

+0

不想花费15美元 – KevinDTimm