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 / 22
is 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
除此之外,bc
Python 可以用于任意大的数字。