C ++中不同的NaN值

Ngu*_*Tâm 1 c++ c++14

我以为NaNJava和C#中只有一个值,但是我发现NaNC ++中有一些不同类型的值。它们具有相同的含义吗?它们之间有什么区别:

cout << numeric_limits<double>::infinity() - numeric_limits<double>::infinity() << endl; // -nan(ind)
cout << numeric_limits<double>::quiet_NaN() << endl;//nan
if ((numeric_limits<double>::infinity() - numeric_limits<double>::infinity()) == numeric_limits<double>::quiet_NaN()) {
        cout << "THE SAME" << endl;
} 
else {
    cout << "NOT THE SAME"<<endl;
}
Run Code Online (Sandbox Code Playgroud)

它可以打印出来NOT THE SAME,但是当我std::isnan()用来测试值是否NaN均为true时。

isnan(numeric_limits<double>::infinity() - numeric_limits<double>::infinity());// true
isnan(numeric_limits<double>::quiet_NaN()); // true
Run Code Online (Sandbox Code Playgroud)

Bkt*_*ero 5

Wikipedia解释了什么是Nan和安静的Nan:https//en.wikipedia.org/wiki/NaN

这些概念在C ++中实现:

引用来自https://en.cppreference.com/w/cpp/numeric/math/isnan

有许多不同的NaN值,它们具有不同的符号位和有效载荷,请参阅std::nanstd::numeric_limits::quiet_NaN

NaN值永远不会等于自己或其他NaN值。IEEE-754不需要复制NaN来保留其位表示(符号和有效载荷),尽管大多数实现都需要这样做。

测试浮点值是否为NaN的另一种方法是将其与自身进行比较: bool is_nan(double x) { return x != x; }

重要的是要注意,IEEE754(表示浮点数的最常用方法)并没有定义一个NaN,而是定义了一种格式来表示NaN(这意味着多个数字可以是NaN)。请参阅:https//en.wikipedia.org/wiki/IEEE_754-1985#NaN

IEEE 754-1985中的所有NaN都具有以下格式:

  • 符号 = 0或1。
  • 有偏指数 =所有1位。
  • 分数 =除全0位外的所有内容(因为全0位表示无穷大)。