在C和Java中,定义的常量表示整数可以容纳的最大值和最小值。
awk
中是否存在此类常量?如果是这样,他们的名字是什么?
awk manual表示awk可以支持-M
的任意精度整数运算,但是当我们不时,我想知道整数的界限指定-M
。
答案 0 :(得分:3)
不是我之前考虑过的事情,所以我可能会完全咆哮错误的树,但由于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。想想看,尝试一下,看看它是否符合您的需求......
答案 1 :(得分:1)
当前(g
)awk
的高整数在没有-M
的情况下被奇怪地破坏了。容易发现BEGIN {print 2^1024}
产生inf
,而BEGIN {print 2^1023}
起作用。因此,人们会假设在此特定实现中,最大整数为2 1024 -1。但是,不是。
基于2 1024 −1 = 2 1023 + 2 1022 + + + 2 的事实进行的简单实验1 + 2 0 :
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
输出,尽管看起来保持不变)超过一定阈值,最终会产生无穷大。这绝对是一个错误。
至于上面的原始和(2 1023 +⋯+ 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
!