Есть ли в awk эквивалент INT_MIN и INT_MAX? - PullRequest
0 голосов
/ 28 апреля 2018

В C и Java определены константы, представляющие максимальные и минимальные значения, которые может содержать целое число.

Есть ли такие константы в awk? Если да, то как их зовут?

Руководство awk указывает, что awk может поддерживать целочисленную арифметику произвольной точности с -M, но я хотел бы знать о границах целых чисел, когда мы не указываем -M.

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

Высокие целые числа в токе (g) awk странно ломаются без -M. Легко заметить, что BEGIN {print 2^1024} дает inf, тогда как BEGIN {print 2^1023} работает. Поэтому можно предположить, что максимальное целое число в этой конкретной реализации составляет 2 1024 & minus; 1. Тем не менее, это не дело.

Простой эксперимент, основанный на том факте, что 2 1024 & минус; 1 & равно; 2 1023 и плюс; 2 1022 и плюс; & # X22ef; & Плюс; 2 1 и плюс; 2 0

BEGIN {for (i = 1023; i >= 0; --i) sum += 2^i; print sum}

Это ^^^ дает бесконечность, как ни странно. Итак, в какой момент нам нужно прекратить добавлять степени 2, чтобы получить действительный результат? В моих системах ограничение составляет 971 & mdash; попробуй 970 и получишь сумму в бесконечность.

BEGIN {for (i = 1023; i >= 971; --i) sum += 2^i; print sum}

Этот ^^^ печатает 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.

Значение имеет удивительное свойство в awk: все, что вы добавляете к нему, вплоть до определенного числа, больше не меняет его. (Попробуйте напечатать (например) sum + 3.) Увеличение его (хотя оно, кажется, остается неизменным, основываясь на выводе print) за пределами определенного порога приводит к бесконечности, в конце концов. Это определенно ошибка.

Что касается исходной суммы, указанной выше (2 1023 & plus; & # x22ef; & plus; 2 971 ), она все равно верна в awk. Вещи начинают разваливаться, когда вы пытаетесь увеличить эту сумму дальше. Например (и удивительно), это все равно дает тот же результат, что и выше:

BEGIN {for (i = 1023; i >= 971; --i) sum += 2^i
       for (i = 969; i >= 0; --i) sum += 2^i
       print sum}

Проверить обе суммы с помощью Python просто:

sum = 0

for i in range(971, 1024):
  sum += 2**i
print(sum)  # awk gets this right

for i in range(0, 970):
  sum += 2**i
print(sum)  # awk without -M gets this wrong

В общем, я думаю, что теперь я буду устанавливать -M в awk все время!

0 голосов
/ 28 апреля 2018

Не то, что я рассматривал ранее, поэтому я могу полностью лаять неправильное дерево, но, поскольку awk по умолчанию использует числа с плавающей запятой двойной точности, возможно, то, что вы ищете, основано на значении PREC в gawk (см. https://www.gnu.org/software/gawk/manual/gawk.html#Setting-precision). Смотри:

$ awk 'BEGIN{print PREC}'
53

$ awk 'BEGIN{print (2^52)}'
4503599627370496
$ awk 'BEGIN{print (2^52)+1}'
4503599627370497

$ awk 'BEGIN{print (2^PREC)}'
9007199254740992
$ awk 'BEGIN{print (2^PREC)+1}'
9007199254740992

Обратите внимание, что целочисленная арифметика не работает, когда вы пытаетесь выйти за пределы 2^PREC? Поэтому, возможно, 2^PREC - это разумное значение для эквивалента MAX_INT, и вы можете получить MIN_INT аналогичным образом. Подумайте об этом, попробуйте, посмотрите, имеет ли это смысл для ваших нужд ...

...