awk
中是否有这样的常量?如果有的话,它们的名称是什么?
awk手册指出,当我们不指定-M
时,awk可以支持任意精度整数算术,但我想知道整数的边界是什么。我之前并没有考虑过这个问题,所以完全可能是在错误的方向上努力,但由于awk默认使用双精度浮点数,也许你正在寻找的内容基于gawk中PREC
的值(参见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。思考一下,尝试一下,看看它是否符合你的需求...g
)awk
中高整数奇怪地破碎,没有-M
。很容易发现BEGIN {print 2^1024}
会产生inf
,而BEGIN {print 2^1023}
可以正常工作。因此,人们会认为这个特定实现中的最大整数是21024 − 1。然而,这不是事实。BEGIN {for (i = 1023; i >= 0; --i) sum += 2^i; print sum}
令人惊讶的是,这会得到无穷大。那么,在哪一点上我们需要停止添加2的幂以获得有效结果?在我的系统上,极限似乎是971,尝试970则总和为无穷大。
BEGIN {for (i = 1023; i >= 971; --i) sum += 2^i; print sum}
这^^^打印出 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368
。
这个值在 awk
中具有惊人的特性:无论您添加多少,直到某个数字,都不会再更改它。(尝试打印 (例如) sum + 3
。) 将其增加到一定阈值以上(基于 print
输出,它似乎仍然没有变化)将最终产生无穷大。 这肯定是一个错误。
至于上面的原始总和 (21023 + ⋯ + 2971),在 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
awk
中设置 -M
参数!-M
或--bignum
(https://www.gnu.org/software/gawk/manual/html_node/Options.html)可能特定于`gawk`。许多发行版(包括Ubuntu)可能默认使用其他版本,如`mawk`。 - mwfearnley
gawk
手册。对于 awk,您必须转到 POSIX。 - Thomas Dickey