是否有相当于INT_MIN和INT_MAX的awk?

时间:2018-04-27 21:53:01

标签: awk gawk

在C和Java中,定义的常量表示整数可以容纳的最大值和最小值。

awk中是否存在此类常量?如果是这样,他们的名字是什么?

awk manual表示awk可以支持-M的任意精度整数运算,但是当我们时,我想知道整数的界限指定-M

2 个答案:

答案 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)

当前(gawk的高整数在没有-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