我对以下行为感到惊讶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!
以下部分来自manual http://www.gnu.org/software/gawk/manual/gawk.html#Floating-Point-Issues应该可以帮助你理解issue你正在观察:
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 http://dl.acm.org/citation.cfm?id=103163
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)