jks*_*hah 5 floating-point 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 ...
Run Code Online (Sandbox Code Playgroud)
有人可以轻视这里有什么东西吗?
编辑1
正如@fedorqui所指出的,由于重定向运算符(>),第二个最后一个命令的输出转到名为0.1的文件.
那么我应该如何执行大于(>)的操作呢?
@fedorqui也提供了解决方案
$ awk 'BEGIN {print (2.3-2.2>0.1)}'
0 <-- Wrong!
Run Code Online (Sandbox Code Playgroud)
本手册的以下部分可帮助您了解您正在观察的问题:
15.1.1.2浮点数不是抽象数
与抽象意义上的数字(例如您在高中或大学算术中学习的数字)不同,存储在计算机中的数字在某些方面受到限制.它们不能代表无限数量的数字,也不能总是完全代表事物.特别是,浮点数不能总是精确地表示值.这是一个例子:
Run Code Online (Sandbox Code Playgroud)$ 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
| 归档时间: |
|
| 查看次数: |
15660 次 |
| 最近记录: |