非常小浮点数的奇数'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