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

时间:2018-01-31 19:31:25

标签: c++ nan armadillo

" C ++ NaN"我正在谈论的是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矩阵中找到并返回一个值:

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)这样的函数是否仍能按预期工作呢?

1 个答案:

答案 0 :(得分:3)

NaN是底层double实现的一类值,几乎在任何定义std::nan并且Armadillo可以运行的平台上,它将是通常的IEEE 754.任何安静的NaN都只是和其他任何一样丑陋 - 也就是说它们都会比任何价值(包括它自身)都不同,这是一个用硬件处理的东西,而不是Armadillo或标准库。

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