想象一下,我写了一个简单的计算器应用程序,它只计算简单的东西
1.5 + 30 + 9755 - 30 - 20000 + 999900.54
我记得在使用浮点数时存在一些精度问题.我的计算器应用程序会在哪个时候开始创建错误的结果?大多数时候,我只计算1 + 2 - 963422之类的整数,但有时候我可能会输入一个浮点数.关于精度问题何处开始生效,我一无所知.这个双倍的最后一个数字?像-963419.0000000000003655?或者看起来怎么样?任何想法如何抓住那些?
引用维基百科:
除了失去显着性,无法准确表示π和0.1等数字以及其他轻微不准确之外,还可能出现以下现象:
- 取消:减去几乎相等的操作数可能会导致极度精度损失.这可能是最常见和最严重的准确性问题.
- 转换为整数并不直观:转换(63.0/9.0)到整数产生7,但转换(0.63/0.09)可能产生6.这是因为转换通常是截断而不是舍入.地板和天花板功能可以产生从直观预期值中偏离一个的答案.
- 有限指数范围:结果可能溢出,产生无穷大或下溢,产生次正规数或零.在这些情况下,精度将会丧失.
- 安全划分的测试存在问题:检查除数不为零并不能保证除法不会溢出并产生无穷大.
- 对平等的测试是有问题的.在数学上相等的两个计算序列可以产生不同的浮点值.程序员经常在一定的容差范围内进行比较(通常是十进制常数,本身没有准确表示),但这并不一定会使问题消失.
为了避免此类问题,您需要分析特定的计算,以便最大限度地减少错误传播.