Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 浮点数减法精度差_C_Floating Point_Precision - Fatal编程技术网

C 浮点数减法精度差

C 浮点数减法精度差,c,floating-point,precision,C,Floating Point,Precision,我尝试从外部图像处理库中复制一些算法,发现了奇怪的浮点数减法精度错误 在原始库(在32位调试配置上运行)中,有一段代码: double d1 = *im1 - m_Centroids[j][0]; 此时我的代码与此相同(也在32位调试配置上运行): 在原始库中程序执行的某个点(停止调试时),这些变量具有值(在VisualStudio监视窗口中): (请参见最后两个之间的差异) 此外,我还在同一台64位计算机上的不同VisualStudio实例上同时运行了原始代码和我的代码 这种差异导致我的程序

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

在原始库(在32位调试配置上运行)中,有一段代码:

double d1 = *im1 - m_Centroids[j][0];
此时我的代码与此相同(也在32位调试配置上运行):

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

(请参见最后两个之间的差异)

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

这种差异导致我的程序在最后的结果与原来的略有不同


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

我找到了一个解决方案,可以在我的代码中实现相同的结果,方法如下:

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

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

您使用的是x87 fpu吗?如果是这样,我表示哀悼。以下是常见问题的简单答案@风向标我不认为这个答案可以解释为什么同一段代码可以产生两种不同的结果。也许你应该再读一遍。6416969-1136266=5280703。调试器似乎没有显示(完全)正确的数字。您的问题特定于Visual Studio。只要使用的是
GCC-std=c99
GCC-msse2-mfpmath=sse
,现代版本的GCC就永远不会产生这种结果。你应该考虑把它贴上标签。
double d1 = *im1 - m_Centroids[j][0];
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