我想在我的构建选项中启用-Wfloat-equal(这是一个GCC标志,当通过==或!=运算符比较两个浮动指针号时发出警告)。但是,在我使用的库的几个头文件中,以及我自己的代码的很大一部分,我经常想要使用if (x)
或if (x != 0)
或变体来分支浮点数或双精度值的非零值那个。
因为在这些情况下我绝对确定该值正好为零 - 检查的值是显式零初始化calloc
等的结果 - 我不能看到使用此比较的缺点,而是而不是对near(x, 0)
函数的更昂贵和更不易读的调用。
是否有某种方法可以使-Wfloat-equal
对所有其他类型的浮点相等比较产生影响,但允许它们传递未标记的?库头文件中有足够的实例可以显着污染我的警告输出。
答案 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)