2015-10-17 85 views
0

我尝试从外部图像处理库中重现一些算法,发现奇怪的浮点数减法精度错误。浮点数减法精度差

在原始文库(其在32位的调试配置运行)有一段代码:

double d1 = *im1 - m_Centroids[j][0]; 

我的代码是在该时刻是相同的(也在32位的调试配置运行):

double d1 = *im1 - m_Centroids[j][0]; 

在原有的库这些变量有值的程序执行(停止调试时)的一些点(在VisualStudio的监视窗口):

Original code: 

*im1         0.113626622   float 
double(*im1)       0.11362662166357040 double 
m_Centroids[j][0]     25.6416969   float 
double(m_Centroids[j][0])   25.641696929931641 double 
*im1 - m_Centroids[j][0]   -25.5280704   float 
double(*im1 - m_Centroids[j][0]) -25.528070449829102 double 
d1         -25.528070308268070 double 

(见的差别最后两个之间)

My code: 

*im1         0.113626622   float 
double(*im1)       0.11362662166357040 double 
m_Centroids[j][0]     25.6416969   float 
double(m_Centroids[j][0])   25.641696929931641 double 
*im1 - m_Centroids[j][0]   -25.5280704   float 
double(*im1 - m_Centroids[j][0]) -25.528070449829102 double 
d1         -25.528070449829102 double 

上单独VisualStudio的情况下,我也已经运行原代码和我的代码同时,同样的64位计算机上。

这种差异导致我的程序在结尾处的结果略微不同于原始结果。

减法中这种差异的原因是什么? (考虑到,这是他们所运行的同一台机器相同的配置)

+0

您使用x87 fpu吗?如果是这样,我的哀悼。 – EOF

+0

以下是常见问题解答的库存答案。 http://stackoverflow.com/questions/588004/is-floating-point-math-broken –

+1

@WeatherVane我不认为这个答案解释了为什么同一段代码可以产生两个不同的结果。也许你应该再读一遍。 –

回答

0

我已经找到了解决方案,实现从我的代码相同的结果: Difference in floating point arithmetics between x86 and x64

办法是强迫我的代码发出SSE即使对于32位配置也是如此,因为它是在原始库中完成的。

当我设置 将SIMD扩展流式传输到(/ arch:SSE)时,结果变得相同。