我对在代码中执行浮点相等比较的问题有些熟悉。

目前,我正在(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))) {
   ....
  }
}

08-16 00:39