浮点数的计算误差对OI的影响
什么是浮点数计算误差
浮点数计算误差就是因为一些存储或底层计算无法保证精度而导致的误差,通过多次运算和合并的累积效应,形成的较大误差。这类误差广泛地存在于各类多次运算后得到的计算结果中,它是不可避免的。现在可以用一些手段忽略或减小误差,使结果尽量正确。
浮点数计算误差产生的原因是什么
我们知道,计算机内部采用二进制记录所有的数据,在一些转换后,一些小数是无法用二进制完全表示的。这种微小的误差在多次运算后被扩大,对结果的精度产生影响。或是干扰我们的判等、判相对大小操作。
怎么减小或避免这种误差
根据网上的文档,这里整理出了一些方法。
- 对于比较小的数据,我们可以将其扩大10^n倍使其变为一个整数,整数是可以完全被二进制表示的,因此不会产生误差。(不常用)
- 使用double代替float提高精度,减小误差带来的影响(除非空间非常紧张)。
- 设置一个精度的阈值EPS,这个值非常小,可以取10e-6之类的值。
认为小于EPS的浮点数就是0,大于EPS的浮点数不是0。类似地,如果想判断两浮点数是否相等,可以求差再与EPS比较。
其实这个比较还可以写成以下形式:(x > EPS) - (x < -EPS)
直接比较上式的值与0的关系。
- 有的时候输出可能会产生-0.0之类的情况,这个负号实际上是因为这里有精度误差(完整的浮点数可能是-1e-10之类极小的数),这个时候对它加一个EPS就可以解决问题了。
- 对大浮点数和一段小浮点数进行运算的时候,如果浮点数相对太小,可能会相当于没运算。解决方案是先对其求和再运算。
除了这些以外还有更多的技巧,可以在网上或参考资料中找到。
总结
使用浮点数(尤其是精度较小的float)是很有风险的,如果遇到数据很接近的题目容易跳进坑里。记住这些小技巧并且能熟练运用是必须的。因此这些问题一定要在做题的同时总结。