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位计算机上。
这种差异导致我的程序在结尾处的结果略微不同于原始结果。
减法中这种差异的原因是什么? (考虑到,这是他们所运行的同一台机器相同的配置)
您使用x87 fpu吗?如果是这样,我的哀悼。 – EOF
以下是常见问题解答的库存答案。 http://stackoverflow.com/questions/588004/is-floating-point-math-broken –
@WeatherVane我不认为这个答案解释了为什么同一段代码可以产生两个不同的结果。也许你应该再读一遍。 –