是否有与INT_MIN和INT_MAX等效的awk?

问题描述 投票:2回答:2

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

awk有这样的常数吗?如果是这样,他们的名字是什么?

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

awk gawk
2个回答
4
投票

这不是我以前考虑过的事情所以我可能会完全咆哮错误的树,但是因为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。想想看,尝试一下,看看它是否适合您的需求....


2
投票

当前(gawk的高整数在没有-M的情况下奇怪地被打破。很容易发现BEGIN {print 2^1024}产生inf,而BEGIN {print 2^1023}工作。因此可以假设该特定实现中的最大整数是21024-1。但事实并非如此。

一个简单的实验,基于21024 - 1 n等于的事实; 21023+ 21022+ ⋯+ 21加; 20:

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

总而言之,我想我将从现在开始一直在-M设置awk

© www.soinside.com 2019 - 2024. All rights reserved.