【问题标题】:Is there an awk equivalent of INT_MIN and INT_MAX?是否有 INT_MIN 和 INT_MAX 的 awk 等效项?
【发布时间】:2019-04-10 23:53:11
【问题描述】:

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

awk中有这样的常量吗?如果有,他们叫什么名字?

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

【问题讨论】:

  • 它是实现定义的(你必须编写一个测试程序来确定可用的精度)。顺便说一句,那是 gawk 手册。对于 awk 你必须去 POSIX。

标签: awk gawk


【解决方案1】:

我之前没有真正考虑过,所以我可能完全错误地查找了错误的树,但是由于 awk 默认使用双精度浮点数,所以您正在寻找的可能是基于 @987654322 的值@ in gawk(见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】:

    当前 (g)awk 中的高整数在没有-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
    

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

    【讨论】:

    • 很好的调查。乍一看,如果您假设变量都是双精度浮点数,那么这些令人惊讶的属性可能都是有意义的。注意:-M--bignum (gnu.org/software/gawk/manual/html_node/Options.html) 可能特定于 gawk。许多发行版(包括 Ubuntu)可能默认使用其他版本,例如 mawk
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多