Вопрос по форматированному выводу в awk
Помогите, пожалуйста, разобраться с логикой printf в awk. Например, a делаю форматированный вывод для -1 через %u.
$ gawk --bignum 'BEGIN {printf "%u\n", -1}'
> 18446744073709551615
Результат - это переход через интервал (0; 2^64 - 1). Я делаю вывод, что целые значения для unsigned определены на этом интервале. Соответственно, для
$ gawk --bignum 'BEGIN {printf "%u\n", -9223372036854775808}'
> 9223372036854775808
всё работает. Но только перешагиваем через 2^63, всё "ломается"
$ gawk --bignum 'BEGIN {printf "%u\n", -9223372036854775809}'
> -9.22337e+18
т.е. %u перестаёт работать, выводится само число. Хотя, вроде, значение должно попадать в интервал (0; 2^64 - 1). Почему так происходит?
Ответы (1 шт):
В документации описаны пределы, конкретно для диапазона 64-битного знакового:
64-bit signed integer -9,223,372,036,854,775,808 9,223,372,036,854,775,807
(не забываем, что минус тоже занимает место — один бит), а также комментарий к %u:
Print an unsigned decimal integer.
(This format is of marginal use, because all numbers in awk are floating point; it is provided primarily for compatibility with C.)
Там же чуть ниже:
NOTE: When using the integer format-control letters for values
that are outside the range of the widest C integer type, gawk switches to
the ‘%g’ format specifier.
Для поддержки больших чисел awk должен быть собран с поддержкой GMP.
Поводя итоги, документация описывает необходимые условия для работы с большими числами, хотя ответ на ваш вопрос не лежит на поверхности, а скорее является особенностью имплементации.