Странная `gawk` фильтрация очень маленького числа с плавающей точкой - PullRequest
1 голос
/ 12 апреля 2019

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 Ответ

2 голосов
/ 12 апреля 2019

Я бы не предположил, что 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

Вы можете увидеть, с какими типами думает gawk, вызвав typeof () для каждого:

$ 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...