awk чтение с плавающей запятой: не может читать маленькие числа с плавающей запятой, например. 4е-320

Я не могу заставить awk или gawk читать небольшие числа с плавающей запятой в экспоненциальном представлении и правильно интерпретировать их как числа с плавающей запятой.

Я просто хочу выводить числа выше небольшого порога с помощью awk.

Пример:

рассмотрим следующий ввод:

4
3e-20
4.5e-320
3
1e-10

Я хочу установить порог на 1e-15, поэтому я делаю следующее:

echo -e "4\n3e-20\n4.5e-320\n3\n1e-10"  |  awk '$1 > 1e-15'

который дает вывод:

4
4.5e-320
3
1e-10

Конечно, 4.5e-320 не проходит порог 1e-15, но awk и gawk его не отвергают!

Я посмотрел (g)awk точность с плавающей запятой. Похоже, что он применяется только к арифметическим операциям внутри awk.

Таким образом, замена awk '$1 > 1e-15' на gawk -v PREC="double" '$1 > 1e-15' также не работает. Это также не работает с PREC="quad"

таким образом, я заключаю, что (g)awk не читается 4.5e-320 как число с плавающей запятой, а вместо этого строка?


person cmo    schedule 22.07.2015    source источник
comment
Я получаю 4, 3, 1e-10 в качестве вывода вашей команды здесь. Какую версию awk вы используете? Какая локаль? Использование $1+0 > 1e-15 работает лучше?   -  person Etan Reisner    schedule 22.07.2015
comment
64-битные числа с плавающей запятой обычно имеют диапазон от e-308 до e308.   -  person karakfa    schedule 22.07.2015
comment
@karakfa также не работает с квадроциклом. вопрос отредактирован, чтобы показать это   -  person cmo    schedule 22.07.2015
comment
@EtanReisner я использую GNU Awk 4.1.1, API: 1.1   -  person cmo    schedule 22.07.2015
comment
@EtanReisner, трюк $1+0 сработал. это почему? может быть, вы можете представить в качестве ответа. Кроме того, какую локаль я должен использовать в awk? я вообще не знаком с локалями   -  person cmo    schedule 22.07.2015
comment
Использование +0 заставляет awk преобразовать аргумент в число.   -  person Etan Reisner    schedule 22.07.2015


Ответы (1)


Я получаю ожидаемый результат от awk версии 3.1.5.

Я получаю ваш вывод из awk версии 3.1.7.

Вы можете заставить awk преобразовать строку в число, добавив к ней ноль.

Поэтому попробуйте вместо этого этот awk-скрипт:

printf '4\n3e-20\n4.5e-320\n3\n1e-10\n' | awk '$1+0 > 1e-15'
person Etan Reisner    schedule 22.07.2015
comment
так awk версии 3.1.7 потерял функциональность? - person cmo; 22.07.2015
comment
Это определенно изменилось с 3.1.5 (я уже видел это кучу). Я не могу сказать конкретно, какие именно изменения коснулись ее. - person Etan Reisner; 22.07.2015