很小的浮点数的奇数“ gawk”过滤

时间:2019-04-12 13:33:27

标签: 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 < 5e-4'应该保留条目$2 < 3.92e-373,这对gawk '$2 < 5e-8'有用。

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

1 个答案:

答案 0 :(得分:2)

我不认为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

您可以通过在每个类型上调用typeof()来查看gawk认为要处理的类型:

$ 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

所以看来strtonum("5e-4")是多余的,但是恕我直言,它提高了清晰度,所以我会保留它。

请注意,gawk不会自动将3.92e-373识别为数字,因此该输入的比较将是字符串与数字的比较,并作为字符串比较完成(请参见https://www.gnu.org/software/gawk/manual/gawk.html#Typing-and-Comparison上的表)。