除了字面零之外,我可以获得-Wfloat等于所有比较的行为吗?

时间:2011-02-25 23:01:09

标签: gcc compiler-warnings

我想在我的构建选项中启用-Wfloat-equal(这是一个GCC标志,当通过==或!=运算符比较两个浮动指针号时发出警告)。但是,在我使用的库的几个头文件中,以及我自己的代码的很大一部分,我经常想要使用if (x)if (x != 0)或变体来分支浮点数或双精度值的非零值那个。

因为在这些情况下我绝对确定该值正好为零 - 检查的值是显式零初始化calloc等的结果 - 我不能看到使用此比较的缺点,而是而不是对near(x, 0)函数的更昂贵和更不易读的调用。

是否有某种方法可以使-Wfloat-equal对所有其他类型的浮点相等比较产生影响,但允许它们传递未标记的?库头文件中有足够的实例可以显着污染我的警告输出。

3 个答案:

答案 0 :(得分:3)

从您提出的问题来看,警告似乎完全合适。如果您要与精确零进行比较,以测试数据是否仍然具有来自calloc的初始零值(从纯C的角度来看实际上是错误的,但适用于任何符合IEEE 754标准的实现),您可能会得到错误来自非零值的正数已四舍五入为零。换句话说,听起来你的代码不正确。

答案 1 :(得分:2)

这太可怕了,但这避免了警告:

#include <functional>

template <class T>
inline bool is_zero(T v)
{
    return std::equal_to<T>()(v, 0);
}

GCC不会报告系统标头的警告,这会导致在系统标头内发生相等测试。

答案 2 :(得分:0)