什么样的C++常量/宏是-1.#IND

What kind of C++ constant/macro is -1.#IND?

本文关键字:宏是 #IND 常量 C++ 什么样      更新时间:2023-10-16

数学"pow"函数返回-1.#IND。-1.#IND 是什么样的错误值,如何检测 if 语句中的错误?

-1.#IND是 Windows 上 NaN 的文本表示。

您可以使用以下小函数检查浮点值是否为 NaN:

// NaN never compares equal, not even to itself
bool is_nan(double d){ return d != d; }

(正如@chris所指出的,如果你有一个符合 C++11 标准的 stdlib,你会得到std::isnan <cmath>

在正常的程序流程中,只要您理智地检查您的数学输入,就不需要担心 NaN。当然,你也可以走另一条路,只是做你的数学计算,然后检查NaN。:)

您看到的值是 NaN 的表示形式,而不是数字。这些值显示为具有未定义值的浮点运算的结果。例如,0.0 / 0.0将产生 NaN。在许多其他情况下会产生 NaN。如果要确定浮点值是否为 NaN,可以测试它们:

if (std::isnan(value)) {
    ...
}
由于

浮点运算,很少有其他特殊值可以产生,例如,正无穷大或负无穷大,并且在<cmath>中也有针对这些值的测试。

-1#IND 通常发生在代码中的某个位置有/0 时。 通过检查 pow 函数中的所有分母或基数来防止它,并带有 0 的 -ve 指数。

除法或 pow 操作完成后,如果您没有检查输入,请使用以下命令检查输出:

if (output != output)  return 0; // or some default
else                   return output;

-1.#IND是一个NaN,而不是一个数字。NaN的出现有很多原因。0.0/0.0 等表达式是不确定的;如果你尝试,你会得到一个 NaN。-1(或任何负实数)的平方根是纯虚数;使用浮点或双sqrt函数,您将获得 NaN。这里的结果不是不确定的,但也不是真实的。这是一个 NaN。

表达sqrt(-1.0)的另一种方式是pow(-1.0, 0.5)。这也会产生一个 NaN。