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

Kar*_* D. 5 c++ floating-point gcc compare clang

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

目前我正在编译的代码库(GCC,Clang)启用了以下选项:-Wfloat-equal

在代码库中有以下示例比较:

template <typename FloatType>
void foo(FloatType v) {
  if (v == FloatType(1)) {
   ...
  }
  else if (v == FloatType(0)) {
   ....
  }
}
Run Code Online (Sandbox Code Playgroud)

foo函数调用如下:

double d = 123.98;
float f = 123.98f;

foo(d);
foo(f);
Run Code Online (Sandbox Code Playgroud)

给出1和0的特殊情况,每个情况都有浮点(double,float)中的精确表示,并且代码明显位于完全相等之后,而不是某些微小差异接近的情况 -

有没有办法重写代码,以便它不会提高相关的Wfloat相同的诊断,也将是可移植的,并支持浮点型和双重类型?

Mar*_*Txz 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))) {
   ....
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为这更像是一个错误(由用户直接触发的库代码不会引发警告),而不是消除此类警告的预期方法。一种更容易理解的方法是编写“float_equal_no_warning”函数或类似函数。 (2认同)