非常小浮点数的奇数'gawk'过滤

非常小浮点数的奇数'gawk'过滤,awk,floating-point,Awk,Floating Point,gawk根据使用的阈值,以不同方式过滤出非常小的正数,但所有阈值都应保留该条目 示例输入文件,tmp: A 3.92e-373 B 5e-300 C 5e-20 D 5e-6 E 5e-3 输出: % gawk '$2 < 5e-4' tmp B 5e-300 C 5e-20 D 5e-6 % gawk '$2 < 5e-8' tmp A 3.92e-373 D 5e-300 C 5e-20 %gawk'$2

gawk
根据使用的阈值,以不同方式过滤出非常小的正数,但所有阈值都应保留该条目

示例输入文件,
tmp

A 3.92e-373
B 5e-300    
C 5e-20
D 5e-6
E 5e-3
输出:

% gawk '$2 < 5e-4' tmp
B 5e-300
C 5e-20
D 5e-6

% gawk '$2 < 5e-8' tmp
A 3.92e-373
D 5e-300
C 5e-20
%gawk'$2<5e-4'tmp
B 5e-300
C 5e-20
D 5e-6
%目瞪口呆,$2<5e-8'tmp
A 3.92e-373
D 5e-300
C 5e-20
gawk'$2<5e-4'
应将条目保留为
$2<3.92e-373
,该条目适用于
gawk'$2<5e-8'


显然,这是浮点限制的问题,但我发现奇怪的是,两个阈值的结果并不一致。
gawk
不应该简单地将
3.92e-373
限制为
0
,从而在任何情况下都打印这一行吗?

我不认为gawk能够在给定输入和硬编码值的情况下计算出数字和字符串的区别。通过对它们使用
strtonum()
确保它们被视为数字:

$ gawk 'strtonum($2) < strtonum("5e-4")' file
A 3.92e-373
B 5e-300
C 5e-20
D 5e-6

$ gawk 'strtonum($2) < strtonum("5e-8")' file
A 3.92e-373
B 5e-300
C 5e-20
所以看起来strtonum(“5e-4”)是多余的,但我认为它提高了清晰度,所以我会保留它


请注意,gawk不会自动将
3.92e-373
识别为一个数字,因此该输入的比较将是字符串与数字,这将作为字符串比较来完成(请参见中的表格)。

感谢您的详细解释,非常感谢。它解决了我的问题,我学到了一些新东西!另外,我发现的另一个解决方案是使用较新版本的
gawk
,并使用
-M
标志支持任意精度。
$ gawk '{print typeof($2), $2, typeof(5e-4), 5e-4, strtonum($2), strtonum("5e-4")}' file | column -t
string  3.92e-373  number  0.0005  0       0.0005
strnum  5e-300     number  0.0005  5e-300  0.0005
strnum  5e-20      number  0.0005  5e-20   0.0005
strnum  5e-6       number  0.0005  5e-06   0.0005
strnum  5e-3       number  0.0005  0.005   0.0005