awk实战6-awk浮点数精度的坑

awk在处理浮点数加减时默认是按double-float来处理,一般的处理对精度要求没有那么高,因此通常用awk不会踩到精度的坑,当你对精度的要求要达到小数点后面6位以上时,就要注意精度的问题了。

1、精度问题举例

小数点后面6位小数,输出6位正常

$ echo 57760731.179959 | awk '{sum+=$1}END{printf("%.6f\n",sum)}'
57760731.179959

输出8位也正常

$ echo 57760731.179959 | awk '{sum+=$1}END{printf("%.8f\n",sum)}'
57760731.17995900

注意,输出9位就有误差了

$ echo 57760731.179959 | awk '{sum+=$1}END{printf("%.9f\n",sum)}'
57760731.179958999

输出10位的误差更大

$ echo 57760731.179959 | awk '{sum+=$1}END{printf("%.10f\n",sum)}'
57760731.1799589992

2、精度误差的原因和解决方案

awk的默认精度范围是53bit,也就是双精度的范围内,因此在做高精度数值计算时,一定要注意浮点数的精度要求。

要提高精度,可以通过修改PREC内置变量来解决,参考文档:15.4.4 Setting the Precision

$ echo 57760731.179959 | awk -M -v PREC=100 -v CONVFMT=%.30g '{sum+=$1}END{printf("%.10f\n",sum)}'
57760731.1799590000
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容