美文网首页
awk实战6-awk浮点数精度的坑

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

作者: 渐悟懂劲 | 来源:发表于2019-03-03 20:06 被阅读0次

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

相关文章

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

    awk在处理浮点数加减时默认是按double-float来处理,一般的处理对精度要求没有那么高,因此通常用awk不...

  • iOS浮点数精度问题

    前言 浮点数是无法精确表示大部分实数的 单精度浮点数和双精度浮点数 单精度(float),一般在计算机中存储占用4...

  • 浮点数

    双精度浮点数类型 double单精度浮点数类型 float 以上两种都使用 浮点数 来表示小数 : 与之相对的是 ...

  • JavaScript浮点数的精度问题深究

    JavaScript浮点数的精度问题 javascript浮点数的精度问题是老生常谈了,但往往只知道0.1 + 0...

  • mysql8 数据类型 float double decimal

    float数值类型用于表示单精度浮点数值,而double数值类型用于表示双精度浮点数值,float和double都...

  • py_28 Decimal处理小数计算精度问题

    python Decimal这个类处理浮点数精度 浮点数在内存中存储的时候因为存储机制的原因,天然存在精度丢失的现...

  • C 浮点数

    浮点数存储带来的问题 问题背景 计算机中浮点数(float或double类型)都有精度范围,对于超出精度范围的浮点...

  • sys库

    sys.float_info查询浮点数精度

  • 关于Python里面小数点精度控制的问题

    基础 浮点数是用机器上浮点数的本机双精度(64 bit)表示的。提供大约17位的精度和范围从-308到308的指数...

  • swift4-浮点类型

    //定义一个浮点类型var a = 1.5//定义一个单精度浮点数,表示32位浮点数,对数据精度要求不高可以使用此...

网友评论

      本文标题:awk实战6-awk浮点数精度的坑

      本文链接:https://www.haomeiwen.com/subject/onumuqtx.html