使用Wfloat-equal选项将浮点数与1或0进行比较

时间:2017-04-25 08:00:24

标签: c++ gcc floating-point compare clang

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

目前我在(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,float)中的精确表示,并且代码明显位于完全相等之后,而不是某个小的接近差异 -

有没有办法重写代码,以便它不会引发相关的 Wfloat-equal 诊断,并且也可以移植并支持float和double类型?

1 个答案:

答案 0 :(得分:3)

如何使用std::equal_to。就GCC而言,它会在处理包括float-equal

在内的系统头时禁用一大堆检查。
template <typename FloatType>
void foo(FloatType v) {
  if (std::equal_to<FloatType>()(v,FloatType(1))) {
   ...
  }
  else if (std::equal_to<FloatType>()(v,FloatType(0))) {
   ....
  }
}