我对在代码中执行浮点相等比较的问题有些熟悉。
目前,我正在(GCC,Clang)上编译的代码库启用了以下选项: -Wfloat-equal
并且在代码库中有以下示例比较:
template <typename FloatType>
void foo(FloatType v) {
if (v == FloatType(1)) {
...
}
else if (v == FloatType(0)) {
....
}
}
foo函数的调用如下:
double d = 123.98;
float f = 123.98f;
foo(d);
foo(f);
给定1和0的特殊情况,它们分别在浮点数( double ,浮点数)中具有精确的表示形式,并且其中的代码显然在完全相等之后,而不是相差很小的东西-
有没有一种方法可以重写代码,使其不会引发相关的 Wfloat-equal 诊断,并且可以移植并支持浮点和 double 类型?
最佳答案
如何使用std::equal_to
。就GCC而言,它将在处理包括float-equal
的系统 header 时禁用一堆检查
template <typename FloatType>
void foo(FloatType v) {
if (std::equal_to<FloatType>()(v,FloatType(1))) {
...
}
else if (std::equal_to<FloatType>()(v,FloatType(0))) {
....
}
}