为什么std :: isnan()对于具有NAN值的double变量返回false

时间:2018-05-21 11:59:58

标签: c++ qt

我决定使用NAN(也尝试std::numeric_limits::quiet_NaN())作为函数参数的默认值,但当我尝试使用std::isnan进行检查时,它返回{{1} }。同时,使用false将值打印到控制台,我看到qDebug()

我还尝试使用nan规则检查NAN。它适用于x != x,但NAN != NAN获得了false

最后一次尝试是在函数内部定义x != x双变量并尝试使用这两种方法检查它,但它会导致相同的结果。

我无法理解错误。

示例:

NAN

输出:

double abc = NAN;
qDebug()<< abc << (abc != abc) << std::isnan(abc);

2 个答案:

答案 0 :(得分:5)

我不知道我们在项目中使用-ffast-math。这就是导致问题的原因。感谢您的关注和评论。如果您使用-ffast-math,则无法解决问题。您只需要寻找另一种方法来解决您的问题(没有NAN

答案 1 :(得分:2)

std::optional<double>会这样做,然后在你闲暇时你可以专门使用显式NAN位模式来指示未设置的值。该值不会通过FPU寄存器传递,-ffast-math不会影响它。您不仅可以清楚地指出可选参数的意图,而且还可以使其符合编译器:)