C++浮点数误差是啥

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++浮点数误差是啥相关的知识,希望对你有一定的参考价值。

各路大神,请问浮点数误差是什么意思啊,是说比如0.00000013与0.00000014在存储时都存为0.0000001这种意思吗。表示完成不理解。还有怎么判断两个浮点数是否相等。
..

float类型是不精确类型,0.1的就不能用二进制表示出来;即float类型只能由x*2^y表达出的有理数进行编码,1/3,1/5....都不能表达,0.1被定义成了一个近似0.1的数,采用舍入法(由于计算机的浮点存储是有限的);

在C里比较浮点数操作是将两个数的差<0.0000001;或者更小的数来取得两个浮点数相等
参考技术A 严格来说,应该是科学计数法的有效数字位数问题,理论值可能有很多位有效数字,但存储为浮点数时,单精度只有7到8位有效数字,后面的被截断,从而产生误差。科学计算一般采用双精度,有效数字位数可达到13位左右。
判断两个浮点数是否相等时,不能按直接相等判断,一般情况下都是判断两个数的差的绝对值是否小于某个给定的小数(相等于给定一个精度),如单精度取0.0001或更小

js浮点数精度误差问题,解决方法

参考技术A JavaScript 是一门弱类型的语言,从设计思想上就没有对浮点数有个严格的数据类型,所以精度误差的问题就显得格外突出。下面就分析下为什么会有这个精度误差,以及怎样修复这个误差。
首先,我们要站在计算机的角度思考 0.1 + 0.2 这个看似小儿科的问题。我们知道,能被计算机读懂的是二进制,而不是十进制,所以我们先把 0.1 和 0.2 转换成二进制看看:
0.1 => 0.0001 1001 1001 1001…(无限循环)
0.2 => 0.0011 0011 0011 0011…(无限循环)
双精度浮点数的小数部分最多支持 52 位,所以两者相加之后得到这么一串 0.0100110011001100110011001100110011001100110011001100 因浮点数小数位的限制而截断的二进制数字,这时候,我们再把它转换为十进制,就成了 0.30000000000000004。
原来如此,那怎么解决这个问题呢?我想要的结果就是 0.1 + 0.2 === 0.3 啊!!!
有种最简单的解决方案,就是给出明确的精度要求,在返回值的过程中,计算机会自动四舍五入,比如:
var numA = 0.1;
var numB = 0.2;
alert( parseFloat((numA + numB).toFixed(2)) === 0.3 );

乘法运算中有这种,比如0.58*100,结果是57.99999999999999。可以用Math.round()进行处理,

------||-------
尽量避免对小数进行操作,先处理成整数后在进行操作,其结果会比较精确。

以上是关于C++浮点数误差是啥的主要内容,如果未能解决你的问题,请参考以下文章

js浮点数精度误差问题,解决方法

C语言浮点数误差如何解决?如下

C语言浮点数误差的解决

VB单精度、双精度浮点数误差,如何消除

接单日记:理解浮点数运算的误差

浮点数float累加误差解决方式总结