浮点数减法精度差

时间:2015-10-17 21:48:10

标签: c floating-point precision

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

在原始库(运行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

此外,我还在同一台64位计算机上的单独VisualStudio实例上同时运行原始代码和我的代码。

这种差异导致我的程序结果与原始程序略有不同。

这种减法差异的原因是什么? (考虑到,它们运行的​​是相同的机器并且配置相同)

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方案,可以在我的代码中实现相同的结果: Difference in floating point arithmetics between x86 and x64

解决方案是强制我的代码发出SSE指令,即使是32位配置,也就像在原始库中一样。

一旦我设定 将SIMD Extensions流式传输到(/ arch:SSE),结果变得相同。