我对在代码中执行浮点相等比较的问题有点熟悉。
目前我在(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类型?
答案 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))) {
....
}
}