awk 算术与 expr 不同

awk 算术与 expr 不同

awk 算术和 expr 之间有一些对比输出。

例子

expr 11111111111111111111 / 22

给出

505050505050505050

但是用awk:

echo '11111111111111111111' | awk '{q=$1/22;;print q}'

给出

505050505050505024

有人可以解释一下吗?

答案1

大概你的awk作品使用浮点值,就像 GNU awk 似乎做的那样:

$ gawk 'BEGIN{ a = 11111111111111111111; print a, a/22; }'
11111111111111110656 505050505050505024

它无法11111111111111111111准确存储,也无法准确存储余数(11111111111111111111 / 22is 505050505050505029.81...)。

你的expr数字范围似乎更广。我的没有(来自 GNU coreutils 8.26 的那个):

$ expr 11111111111111111111 / 22
expr: 11111111111111111111: Numerical result out of range

作为@steeldriver评论,当前版本GNU awk 也有能力使用GNU MPFR 库用于高精度算术。例如,四精度浮点数足以给出此除法的准确答案:

$ gawk -M -v PREC="quad" -v OFMT="%.6f" \
  'BEGIN{ a = 11111111111111111111; print a, a/22; }'
11111111111111111111 505050505050505050.500000

除此之外,bcPython 可以用于任意大的数字。

相关内容