我尝试从外部图像处理库中重现一些算法,我发现了奇怪的浮点数减法精度误差。
在原始库(运行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实例上同时运行原始代码和我的代码。
这种差异导致我的程序结果与原始程序略有不同。
这种减法差异的原因是什么? (考虑到,它们运行的是相同的机器并且配置相同)
答案 0 :(得分:0)
我找到了一个解决方案,可以在我的代码中实现相同的结果: Difference in floating point arithmetics between x86 and x64
解决方案是强制我的代码发出SSE指令,即使是32位配置,也就像在原始库中一样。
一旦我设定 将SIMD Extensions流式传输到(/ arch:SSE),结果变得相同。