awk中的浮点计算

awk中的浮点计算,awk,floating-point,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 an

我对执行浮点计算时
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 ...
$awk'开始{print 2.3/0.1}'
23)

那么我应该如何执行大于()操作

@fedorqui也给出了解决方案

$awk'开始{print(2.3-2.2>0.1)}

0中的以下部分应有助于您了解您所观察到的问题:

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”,而是一个简单的错误 计算机如何表示数字的人工制品


强烈建议阅读:


+1,了解有趣的问题。我还发现了一些信息-->注意,
awk'BEGIN{print 2.3-2.2>0.1}
2.3-2.2
的结果写入一个名为
0.1
的文件。@fedorqui我也搜索了这个主题。他们所说的只是期待意外的行为!我应该如何准确地解决我的问题?我尝试用
perl
解决问题,但不幸的是,它也会出现错误,可能是以不同的方式出现的。@fedorqui感谢您指出这一点。我已经用添加查询更新了问题!对于这一点,我想解决办法是执行
awk'BEGIN{print(2.3-2.2>0.1)}
。至于其余的,我还在检查,这是一个有趣的话题。不想花15美元
 $ awk '{ printf("%010d\n", $1 * 100) }'
 515.79
 -| 0000051579
 515.80
 -| 0000051579
 515.81
 -| 0000051580
 515.82
 -| 0000051582
 Ctrl-d