C++浮点数误差是啥
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++浮点数误差是啥相关的知识,希望对你有一定的参考价值。
各路大神,请问浮点数误差是什么意思啊,是说比如0.00000013与0.00000014在存储时都存为0.0000001这种意思吗。表示完成不理解。还有怎么判断两个浮点数是否相等。
..
在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++浮点数误差是啥的主要内容,如果未能解决你的问题,请参考以下文章