将 int() 与 log() 结合使用的 awk 舍入错误

将 int() 与 log() 结合使用的 awk 舍入错误

为了以后格式化,我需要计算以 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 位尾数扩展该范围,在某些情况下会失败)。

相关内容