【发布时间】:2017-12-13 10:42:10
【问题描述】:
我用 PVS Studio 分析器扫描了我的代码,我对为什么会出现这个错误以及如何解决这个问题感到困惑。
V550 一个奇怪的精确比较:* dest == value。使用具有定义精度的比较可能会更好: fabs(A - B)
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;
}
【问题讨论】:
-
“如何解决这个问题” 完全按照错误消息中的建议。
-
由于条件
*dest == value在返回时将是true,所以bool返回值中似乎没有任何值。否则,如果此返回值表明某个“缓存”状态发生了变化,而这是您想要的行为,则忽略该建议 - 因为需要精确比较。 -
不幸的是,用高达 epsilon 的测试替换完全相等的建议是虚假的。你只需要忽略它。
-
我们不知道您的代码应该做什么,因此我们无法就如何完成该任务或诊断是否需要对您的代码采取行动提出任何建议部分。
-
@VTT 它应该在那里很合理。那些不太了解浮点的人常犯的一个误解是,认为浮点相等应该始终由与容差的比较来代替。
标签: c++ pvs-studio