限制浮点精度问题的做法

时间:2010-08-20 03:45:45

标签: floating-point

作为程序员,大多数人(如果不是我们所有人)都知道浮点数往往不准确。我知道这个问题无法完全避免,但我想知道是否有任何可用于至少减少浮点错误的实践,模式等。

提前致谢。

2 个答案:

答案 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语法,问题会更糟。在这么少的一组操作之后,你只剩下几个可靠的十进制数字。