为了以后格式化,我需要计算以 10 为底的对数。到目前为止还好:
$ awk 'BEGIN { print log(1000) / log(10) }'
3
$ awk 'BEGIN { print log(1001) / log(10) }'
3.00043
我需要剔除小数,所以我使用int()
:
$ awk 'BEGIN { print int(log(1001) / log(10)) }'
3
到目前为止还好。但这是什么(!):
$ awk 'BEGIN { print int(log(1000) / log(10)) }'
2
任何人都可以解释这个舍入错误或任何这应该是什么?
解决问题的正确方法是什么?
预先非常感谢!
答案1
四舍五入从来都不是一件容易的事,也不可能是一件容易的事精确的然而,最多 15 位(对于 53 位尾数),近似值(四舍五入)应该朝着正确的数字方向发生。
$ printf '%s\n' 999 1000 1001 | awk '{ v=log($1) / log(10); printf("%.15g\n",v) }'
2.99956548822598
3
3.00043407747932
因此,四舍五入到最接近的整数(向零舍入,对于负数也是正确的)%i
将给出您需要的整数:
$ printf '%s\n' 999 1000 1001 |
awk '{
v=log($1) / log(10);
result=sprintf("%.15g",v);
printf("%-15s %i\n",v, result)
}
'
2.99957 2
3 3
3.00043 3
这应该可以正确工作到 14 位数字(不要尝试使用 awk 的默认 53 位尾数扩展该范围,在某些情况下会失败)。