首先回答题主的问题。产生这样的误差的原因在于,浮点数并不能表示所有的实数,对于那些不能表示的数,会选取一个误差最小的,浮点数系统能表示的数来代替它。
这里的问题出在二进制和十进制的转换上,有些用十进制能轻易写出的数,在二进制下就变成了无限小数,自然没有相应的浮点数对应。
解决办法:
1. 自己实现一个浮点数系统,
直接使用十进制表示
,避免了上述在有限精度下不能完成的进制转换。2. 记在浮点数系统下的表示为,那么有
其中为字长,一般取24或53。这说明,在一般的使用中,这个误差是相当小的。对于结果是有限小数的运算来说,这一误差往往并不足以影响到有效的数位。因此,可以估计一下结果的小数位数,并
做四舍五入
,就可以得到精确的结果了。3. 对于那些精度超出现有浮点数系统的计算,哪怕没有二进制-十进制的转换,也是会有误差的。这就要求你实现或使用一套
足以精确表示运算中所有数字
的系统。然后扯点题外话,为什么在实际应用中我们不会考虑这样的问题呢?原因有:
1.
误差并不是只有计算才会带来的
。从实际问题提炼出数学模型时往往忽略了许多次要因素,因而即使数学模型能够求出精确解,也与实际问题的真解不同,它们的差距就是模型误差
。另外,除了程序设定的数,很多计算用到的数都是经由测量得到,由于仪器的精密性、实验手段的局限性,就会有观测误差
。因此,一味的追求计算过程的零误差往往是没有意义的(我们依然致力于将计算误差减小到可接受范围内)。2. 在计算机中,我们能够精确的表示整数。但遗憾的是,实数集对于整数来说,是一个无限维的线性空间。因此,哪怕计算机的容量足够大,也
不存在一种能表示一切实数的万能计数系统
。在这个意义下,浮点数系统是一个相当好的折衷方案。