C++ NaN 和 Armadillo NaN 之间有什么区别?

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

我说的 "C++ NaN" 可能 return 由 this cmath function:

double nan (const char* tagp);

"Armadillo NaN" 是 Armadillo linear algebra package 的一部分:

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

混合使用安全吗?


思维练习:

假设您有一个函数可以从 Armadillo 矩阵中找到并 returns 一个值:

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

说函数确定它应该 return lookup_table(3, 2),并且说值是 arma::datum::nan.

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

NaN 是底层 double 实现的 class 值,在几乎任何定义了 std::nan 且 Armadillo 可以 运行 的平台上,它将是通常的 IEEE 754。任何安静的 NaN 都和其他任何 NaN 一样丑陋 - 即它们都将与任何值(包括其自身)进行比较,这是在硬件中处理的事情,而不是 Armadillo 或标准库。

std::nan returns 和犰狳 NaN 之间的唯一区别可能是它们可以有不同的底层位模式——因为有许多不同的值是有效的 NaN。尽管如此,这种差异仅对明确检查底层字节的代码可见,因此在数字代码中应该是完全不相关的。