C++ NaN和犰狳NaN有什么区别

What are the differences between the C++ NaN and Armadillo NaN?

本文关键字:NaN 什么 区别 C++      更新时间:2023-10-16

我所说的"C++ NaN"是这个cmath函数可能返回的那个:

double nan (const char* tagp);
"犰狳

NaN"是犰狳线性代数包的一部分:

datum::nan      “not a number” (NaN); caveat: NaN is not equal to anything, even itself

混合它们安全吗?


思维练习:

假设您有一个函数,可以从犰狳矩阵中查找并返回一个值:

arma::mat lookup_table;
in a loop or something
double val = deriving_value_from_table(lookup_table, input1, input2, input3 ...)

假设函数确定它应该返回lookup_table(3, 2),并且所述值为 arma::datum::nan

我可以使用val并期望它是一个合适的 NaN 吗?如果我稍后将val放入不同的犰狳矩阵中,像arma::is_finite(X)这样的函数是否仍会按预期工作?

NaN 是底层double实现的一类值,在定义std::nan且犰狳可以运行的任何平台上,几乎都是通常的 IEEE 754。任何安静的 NaN 都和其他任何值一样丑陋——即它们都会比较与任何值(包括它自己(不同的值,这是一个在硬件中处理的事情,而不是由犰狳或标准库处理。

std::nan返回的内容与犰狳 NaN 之间的唯一区别可能是它们可以具有不同的底层位模式 - 因为有许多不同的值是有效的 NaN。尽管如此,这种差异只有显式检查基础字节的代码才能看到,因此在数字代码中应该是完全无关紧要的。