我想在我的构建选项中启用-Wfloat-equal(这是一个GCC标志,当通过==或!=运算符比较两个浮点指针数时会发出警告)。然而,在我使用的几个库的头文件中,以及我自己的代码的很大一部分中,我经常想使用if (x)
或if (x != 0)
或其变体来分支浮点数或双精度浮点数的非零值。
因为在这些情况下,我绝对确定值是零-检查的值是显式零初始化的结果,calloc
等-我看不到使用这种比较的缺点,而不是对我的near(x, 0)
函数的更昂贵和更难读的调用。
有没有什么方法可以让-Wfloat-equal
对所有其他类型的浮点数相等比较产生影响,但允许这些比较不加标记地通过?在库头文件中有足够多的示例,它们可能会严重污染我的警告输出。
3条答案
按热度按时间6l7fqoea1#
从你问的问题来看,这个警告似乎是完全正确的。如果你正在与精确的零进行比较,以测试数据是否仍然具有来自
calloc
的初始零值(从纯C的Angular 来看,这实际上是不正确的,但适用于任何符合IEEE 754的实现),你可能会得到误报,因为非零值被舍入为零。换句话说,听起来你的代码是不正确的。k0pti3hp2#
这是非常可怕的,但这避免了警告:
字符串
GCC不报告系统头的警告,这会导致相等性测试在系统头中发生。
hlswsv353#
检查一个值是否等于零(正或负)的一种可能方法是使用
std::fpclassify
函数(该函数可用于C++以及C)。举例来说:
字符串
构建:
型
运行:
型