我对在代码中执行浮点相等比较的问题有些熟悉。
目前我在(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
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/