有没有类似于INT_MIN和INT_MAX的awk函数?

8
在C和Java中,有定义的常量表示整数可以容纳的最大值和最小值。 awk 中是否有这样的常量?如果有的话,它们的名称是什么? awk手册指出,当我们不指定-M时,awk可以支持任意精度整数算术,但我想知道整数的边界是什么。

2
这是实现定义的(您需要编写一个测试程序来确定可用精度)。顺便说一下,这是 gawk 手册。对于 awk,您必须转到 POSIX。 - Thomas Dickey
2个回答

6

我之前并没有考虑过这个问题,所以完全可能是在错误的方向上努力,但由于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。思考一下,尝试一下,看看它是否符合你的需求...

6
当前(gawk中高整数奇怪地破碎,没有-M。很容易发现BEGIN {print 2^1024}会产生inf,而BEGIN {print 2^1023}可以正常工作。因此,人们会认为这个特定实现中的最大整数是21024 − 1。然而,这不是事实。
一个简单的实验,基于这样一个事实:21024 − 1 = 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

总的来说,我认为从现在开始我会一直在 awk 中设置 -M 参数!

好的调查。乍一看,如果您假设变量都是双精度浮点数,则所有令人惊讶的属性都可能是有意义的。注意:-M--bignum(https://www.gnu.org/software/gawk/manual/html_node/Options.html)可能特定于`gawk`。许多发行版(包括Ubuntu)可能默认使用其他版本,如`mawk`。 - mwfearnley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接