c++ - 使用 Wfloat-equal 选项将 float 与 1 或 0 进行比较

标签 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 类型?

最佳答案

如何使用 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))) {
   ....
  }
}

关于c++ - 使用 Wfloat-equal 选项将 float 与 1 或 0 进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43604873/

相关文章:

c - C 中的动态浮点格式说明符

c++ - Windows XP 上的 Meteorite 安装错误 - 找不到 "c:\Microsoft.Cpp.Default.props"

c++ - SHGetFileInfo 性能问题

C++ 在函数中创建新对象

macos - x64 nasm : pushing memory addresses onto the stack & call function

python - 将 char 数组从 c++(客户端)传递到 python(服务器)winsock

c++ - 当我只调用构造函数时会发生什么?

c++ - 无法将gdb用于cmake生成的执行文件

c - C程序仅在GCC中执行后才终止

使用牛顿拉夫森求立方根