gpt4 book ai didi

c - float 减法精度差异

转载 作者:行者123 更新时间:2023-11-30 17:09:38 25 4
gpt4 key购买 nike

我尝试从外部图像处理库重现一些算法,但发现了奇怪的 float 减法精度错误。

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

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

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

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

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

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 实例上同时运行原始代码和我的代码。

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

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

最佳答案

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

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

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

关于c - float 减法精度差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33191944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com