我以为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)
Wikipedia解释了什么是Nan和安静的Nan:https://en.wikipedia.org/wiki/NaN
这些概念在C ++中实现:
引用来自https://en.cppreference.com/w/cpp/numeric/math/isnan:
有许多不同的NaN值,它们具有不同的符号位和有效载荷,请参阅
std::nan和std::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位表示无穷大)。
| 归档时间: |
|
| 查看次数: |
66 次 |
| 最近记录: |