awk中的整数除法

时间:2013-02-13 16:27:26

标签: awk integer division

我想在awk中使用整数除法分割两个数字,即截断结果。例如

k = 3 / 2
print k

应打印1

根据the manual

  

司;因为awk中的所有数字都是浮点数,结果是 没有四舍五入为整数

是否有解决方法来获取整数值?

原因是我希望得到整数索引[0到num-1]的数组的中间元素

3 个答案:

答案 0 :(得分:30)

使用int函数获取结果的整数部分,截断为0.这将生成最接近结果的整数,位于结果和0之间。例如,int(3/2)为1 ,int(-3/2)为-1。

来源:The AWK Manual - Numeric Functions

答案 1 :(得分:7)

安全快速的awk整数除法可以通过以下方式完成:

q=(n-n%d)/d+(n<0)

答案 2 :(得分:5)

在简单的情况下,您可以安全地使用截断为零 1 int()

awk 'BEGIN { print int(3 / 2) }'    # prints 1
gawk 'BEGIN { print int(-3 / 2) }'  # prints -1; not guaranteed in POSIX awk

请记住,awk总是使用双精度浮点数 2 和浮点算术 3 。获得整数和整数运算的唯一方法是使用外部工具,例如:标准expr实用程序:

awk 'BEGIN { "expr 3 / 2" | getline result; print result; }'    # prints 1

这真是 awk 病房,长,慢,......但安全又便携。


1 POSIX awk中,仅对正参数保证截断为零: int(x) - 将截断的参数返回到整数。当x> 0时,截断应朝向0。 GNU awk(gawk)即使对于负数也使用截断为零: int(x) - 将最接近的整数返回到x,位于x和x之间零并截断为零。例如,int(3)为3,int(3.9)为3,int(-3.9)为-3,int(-3)为-3。
2 在POSIX中,Expressions in awk中的数字表达式被指定为双精度浮点数。
3 所有算术都应遵循ISO C标准规定的浮点运算的语义(参见Concepts Derived from the ISO C Standard)。 - {{3} }


如果您选择使用花车,您应该知道它们的怪癖并准备好发现它们并避免相关的错误。几个可怕的例子:

  • 无法代表的数字:

    awk 'BEGIN { x = 0.875; y = 0.425; printf("%0.17g, %0.17g\n", x, y) }'
    # prints 0.875, 0.42499999999999999
    
  • POSIX awk: Arithmetic functions积累:

    awk 'BEGIN{s=0; for(i=1;i<=100000;i++)s+=0.3; printf("%.10f, %d\n",s,int(s))}'
    # prints 29999.9999999506, 29999
    
  • 舍入错误破坏了比较:

    awk 'BEGIN { print (0.1 + 12.2 == 12.3) }'    # prints 0
    
  • 精度随着幅度的增加而减小,导致无限循环:

    awk 'BEGIN { for (i=10^16; i<10^16+5; i++) printf("%d\n", i) }'
    # prints 10000000000000000 infinitely many times
    

详细了解花车如何工作:

  1. Stack Overflow标签Round-off errors wiki

  2. 维基百科文章

  3. Floating point - 包含有关具体实施和一般知识的信息