我想在我的构建选项中启用 -Wfloat-equal (这是一个 GCC 标志,当通过 == 或 != 运算符比较两个浮点数时会发出警告)。但是,在我使用的几个库的头文件中,以及我自己代码的很大一部分中,我经常想使用 if (x)
为浮点数或 double 数的非零值进行分支。或 if (x != 0)
或它的变体。
由于在这些情况下,我绝对确定该值恰好为零 - 检查的值是显式零初始化的结果,calloc
等 - 我看不出使用这种比较的缺点,而不是对我的 near(x, 0)
的调用相当昂贵且可读性较差。功能。
有什么办法可以得到-Wfloat-equal
的效果吗?对于所有其他类型的浮点相等比较,但允许这些不加标记地通过?在库头文件中有足够多的实例,它们会严重污染我的警告输出。
最佳答案
从您提出的问题来看,警告似乎是完全合适的。如果您要与精确零进行比较以测试数据是否仍然具有来自 calloc
的初始零值(从纯 C 的角度来看,这实际上是不正确的,但适用于任何符合 IEEE 754 的实现),您可能会从四舍五入为零的非零值中得到误报。换句话说,听起来您的代码不正确。
关于gcc - 对于除字面零之外的所有比较,我能否获得 -Wfloat-equal 的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5123651/