我正在尝试使用 gawk 找到一列数据的最大值:
gawk 'BEGIN{max=0} {if($1>0+max) max=$1} END {print max}' dataset.dat
dataset.dat
看起来像这样:
2.0
2.0e-318
该命令的输出是
2.0e-318
明显小于 2。
我的错误在哪里?
编辑
有趣的是,如果交换输入文件的行,输出变为
2.0
编辑 2
我的 gawk 版本是 GNU Awk 4.2.1,API:2.0(GNU MPFR 4.0.2,GNU MP 6.1.2)。
2e-318
在 awk 中处理如此小的数字 ( ) 有几个问题。首先,输入需要在使用前转换为数字。这通常是通过添加 0 来完成的。因此,您需要以下内容:
其次,普通双精度浮点数(53 位尾数和 11 位指数)11 位宽度的指数允许表示 10e-308 和 10e308 之间的数字,因此,普通浮点数将无法表示此类数字。
默认 GNU awk 将不接受以下(正常)值
1e-308
。第三,
awk
(CNVFMT 和 OFMT)的默认转换格式设置为"%.6g"
. 超过 6 位有效数字的数字将被截断。要获得更重要的数字:要求他们。就像%.15g
15 一样(对于 53 位尾数,不要要求超过 17,它可能会撒谎)。第四,最好将第一个值设置为第
max
一个输入。如果输入的最大值为负,将最大值设置为 0 将失败。如果您使用的是 GNU awk 并且它已经以任意精度编译,您可以使用:
或简化为您的用例:
0+ 需要作为每个 $1 的前缀以强制进行数字转换。max 不需要 0+ - 它在存储时已经转换为数字。