我偶然发现了一段用gcc发出警告的代码
float f;
// Calculate a value for f
if (!f == 0.0)
{
// Handle it being non-zero
}这可能只是另一个团队成员的错误,检查代码的真正含义是:
if (f != 0.0)
// OR
if (!(f == 0.0))我已经更正了代码,但我只是想知道!NaN的计算结果是什么。我们在f中使用if值,所以我们不希望NaN通过检查。
发布于 2018-10-22 07:12:06
请参阅转换
整数、浮点、非作用域枚举、指针和指针到成员类型的prvalue可以转换为类型bool的prvalue。 值零(用于整数、浮点和非作用域枚举)以及空指针和空指针到成员的值变为假。所有其他的价值都变成了现实
因此,!f == 0.0等同于!(f != 0.0) == 0.0、(f == 0.0) == false或f != 0.0。
发布于 2018-10-22 06:42:04
如果要避免在NaN中使用if,可以使用该函数
bool isnan( float arg );
进行检查。
函数的参考文献:
NaN值从来不等于自身或其他NaN值。IEEE-754不需要复制NaN来保留其位表示形式(符号和有效负载),尽管大多数实现都是这样做的。
另一种测试浮点值是否为NaN的方法是将其与自身进行比较:
bool is_nan(double x) { return x != x; } C++草案(N4713)规定:
8.5.2.1一元运算符expr.unary.op ..。 9.逻辑否定运算符
!的操作数在上下文上转换为bool (第7条);如果转换后的操作数为false,则值为false。结果的类型是bool。 7.14布尔变换conv.bool 1.算术、非作用域枚举、指针或指针到成员类型的prvalue可以转换为bool类型的prvalue。零值、空指针值或空成员指针值转换为false;任何其他值都转换为真。。
结论: As NaN在表达式!NaN中被上下文转换为true,!NaN是false,因此不是NaN。
发布于 2018-10-22 06:47:16
简单地使用
if (!isnan(f)&& !f == 0.0)
{
cout<<"Filtered NaN values"<<endl;
}https://stackoverflow.com/questions/52923346
复制相似问题