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相同的诊断,也将是可移植的,并支持浮点型和双重类型?
怎么样使用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)