gpt4 book ai didi

c++ - PVS-Studio 提示 float 比较

转载 作者:行者123 更新时间:2023-11-30 05:11:30 24 4
gpt4 key购买 nike

我用 PVS Studio 分析器扫描了我的代码,我对为什么会出现这个错误以及如何解决这个问题感到困惑。

V550 一个奇怪的精确比较:* dest == value。最好使用具有定义精度的比较:fabs(A - B) < Epsilon。

bool PipelineCache::SetShadowRegister(float* dest, uint32_t register_name) {
float value = register_file_->values[register_name].f32;
if (*dest == value) {
return false;
}
*dest = value;
return true;
}

我猜想像这样更改代码:

bool PipelineCache::SetShadowRegister(float* dest, float* epsilon uint32_t register_name) {
float value = register_file_->values[register_name].f32;
return fabs(dest - value) < epsilon;
}

最佳答案

谁想知道,我们正在谈论 this代码。

我将尝试解释 PVS 工作室开发人员试图通过此消息实现的目标。引用他们的 reference关于 V550:

Consider this sample:

double a = 0.5;
if (a == 0.5) //OK
x++;

double b = sin(M_PI / 6.0);
if (b == 0.5) //ERROR
x++;

The first comparison 'a == 0.5' is true. The second comparison 'b == 0.5' may be both true and false. The result of the 'b == 0.5' expression depends upon the processor, compiler's version and settings being used. For instance, the 'b' variable's value was 0.49999999999999994 when we used the Visual C++ 2010 compiler.

他们想说的是,比较 float 是很棘手的。如果您只是分配 float ,将其存储并在内存中移动,以便稍后在此函数中与自身进行比较 - 请随意关闭此错误消息。

如果您希望执行一些位表示检查(老实说我认为您正在做),请参阅下文

如果您正在对 float 进行大量计算,并且您是一名游戏开发人员,正在计算敌方战列巡洋舰的坐标 - 此警告是您最好的 friend 之一。


无论如何,让我们回到您的案例。正如 PVS-Studio 通常发生的那样,他们没有看到确切的错误,但他们为您指明了正确的方向。您实际上比较两个浮点值,但您这样做错误。问题是,如果您比较的两个 float 都包含 NaN(即使在相同的位表示中),您将得到 *dest != value,并且您的代码将无法按您想要的方式工作.

在这种情况下,您最好将 float * 下的内存重新解释为 uint32_t(或任何与 float 具有相同大小的整数类型你的目标)并比较它们。

例如,在您的特定情况下,register_file_->values[register_name] 属于 type xe::gpu::RegisterFile::RegisterValue,已经支持uint32_t表示。

作为副作用,这会消除警告 :)

关于c++ - PVS-Studio 提示 float 比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44999475/

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