我想在构建选项中启用-Wfloat-equal(这是一个GCC标志,当通过==或!=运算符比较两个浮点数时会发出警告)。但是,在我使用的库的几个头文件中,以及我自己的代码的很大一部分中,我经常想使用float或double的非零值进行分支,使用if (x)或if (x != 0)或它们的变体。
由于在这些情况下,我绝对可以确定该值完全为零-检查的值是显式零初始化的结果calloc,等等。-我看不出使用此比较的不利之处,而是成本更高且可读性更差调用我的near(x, 0)函数。
是否有某种方法可以-Wfloat-equal对所有其他种类的浮点相等比较产生影响,但允许这些传递不加标记?库头文件中有足够多的实例,它们可以严重污染我的警告输出。
从你提出的问题来看,这个警告似乎是完全恰当的。如果您与精确的零进行比较来测试数据是否仍然具有其初始零值calloc(从纯 C 的角度来看,这实际上是不正确的,但适用于任何符合 IEEE 754 的实现),您可能会从非零得到误报值已四舍五入为零。换句话说,听起来您的代码不正确。