awk 算法和 expr 之间有一些对比输出。
例子
expr 11111111111111111111 / 22
Run Code Online (Sandbox Code Playgroud)
给
505050505050505050
Run Code Online (Sandbox Code Playgroud)
但是使用 awk:
echo '11111111111111111111' | awk '{q=$1/22;;print q}'
Run Code Online (Sandbox Code Playgroud)
给
505050505050505024
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下吗?
大概你awk
使用浮点值的作品,就像 GNU awk 似乎做的:
$ gawk 'BEGIN{ a = 11111111111111111111; print a, a/22; }'
11111111111111110656 505050505050505024
Run Code Online (Sandbox Code Playgroud)
它不能11111111111111111111
准确存储,也不能准确存储余数(11111111111111111111 / 22
is 505050505050505029.81...
)。
您的expr
数字范围似乎更广。我的没有(来自 GNU coreutils 8.26 的那个):
$ expr 11111111111111111111 / 22
expr: 11111111111111111111: Numerical result out of range
Run Code Online (Sandbox Code Playgroud)
正如@steeldriver评论的那样,当前版本的GNU awk 还能够使用GNU MPFR 库进行高精度算术。例如,四精度浮点数足以给出这个除法的准确答案:
$ gawk -M -v PREC="quad" -v OFMT="%.6f" \
'BEGIN{ a = 11111111111111111111; print a, a/22; }'
11111111111111111111 505050505050505050.500000
Run Code Online (Sandbox Code Playgroud)
除此之外,bc
或者 Python 可以用于任意大的数字。