2017-04-25 79 views
4

我对在代码中执行浮点相等比较的问题有点熟悉。使用Wfloat-equal选项比较浮点数为1或0

目前的代码库,我编译的(GCC,锵)启用以下选项:-Wfloat平等

而在代码库有下面的例子比较:

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的特殊情况,每个具有确切表示浮点(双,浮法)其中在有确切的平等,而不是东西,是一些微小的差别收盘后的代码显然是 -

是有一种重写代码的方法,它不会提高相关联的诊断功能,并且也是可移植的,并支持浮点类型和双精度类型?

+1

你可以使用GCC的'的#pragma GCC诊断推/流行/ ignored'禁用诊断只是那些系统头时,它会关闭了一大堆检查线。 –

+1

当你说memcmp时,你总是可以使用'memcmp' – VTT

+0

@VTT,你的意思是为值0和1有一个单独的变量吗? –

回答

2

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