awk中的浮点计算

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)

dev*_*ull 9

手册的以下部分可帮助您了解您正在观察的问题:

15.1.1.2浮点数不是抽象数

与抽象意义上的数字(例如您在高中或大学算术中学习的数字)不同,存储在计算机中的数字在某些方面受到限制.它们不能代表无限数量的数字,也不能总是完全代表事物.特别是,浮点数不能总是精确地表示值.这是一个例子:

 $ awk '{ printf("%010d\n", $1 * 100) }'
 515.79
 -| 0000051579
 515.80
 -| 0000051579
 515.81
 -| 0000051580
 515.82
 -| 0000051582
 Ctrl-d
Run Code Online (Sandbox Code Playgroud)

这表明某些值可以精确表示,而其他值只是近似值.这不是awk中的"bug",而只是计算机如何表示数字的工件.


强烈推荐阅读:

What every computer scientist should know about floating-point arithmetic

  • 不想花15美元 (3认同)