作为程序员,大多数人(如果不是我们所有人)都知道浮点数往往不准确。我知道这个问题无法完全避免,但我想知道是否有任何可用于至少减少浮点错误的实践,模式等。
提前致谢。
答案 0 :(得分:2)
使用定点数学,你可以处理已知的有限精度。
例如,Rockbox音乐播放器固件几乎使用固定点媒体编解码器。
如果您必须完全准确,请使用GMP库提供的无限长存储类型。
如果您只是想减少错误,请尝试尽可能接近零,其中IEEE FP编号更精确。重新排序操作以避免让绝对值过大。
答案 1 :(得分:0)
浮点精度是一个很大的主题,一些最聪明的计算机科学家多年来一直在研究这个问题。如果你要么没有研究fp准确性,还没有彻底研究你的cs问题,或者不能依赖其他队友完全理解,只要坚持使用双打,而不是32-但浮动,除非你只是在做计算机图形或项目要求单打。
一些任务,如乘法,是交际的。例如,使用Python:
>>>a*a*a*a*a*a
1.1044776737696922
>>> (a*a*a)*(a*a*a)
1.104477673769692
>>> (a*a)*(a*a)*(a*a)
1.104477673769692
答案是相同的,因为指数只是简单地加在一起,而尾数(1.fraction ......)只是乘以没有损失。
另一方面,如果我们以错误的顺序执行减法和乘法,我们可以得到非常不同的结果。
b = 1.00016789
B *(B-1)
0.00016791818705204833
b * b - b
0.00016791818705197414
即使看起来很好,如果你仔细观察,你会发现只有11个十进制数字是正确的。换句话说,((b*(b-1)) - (b*b-b))/b
应该是零,代数,但它出现在7.417408056593443e-17
。这似乎是一个小错误,但浮点错误倾向于以负面方式加起来。如果我们使用单精度float b = 1.00016789
,使用C语法,问题会更糟。在这么少的一组操作之后,你只剩下几个可靠的十进制数字。