1

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

4

4 回答 4

8

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

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

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

(正如@chris 所说,如果你有一个符合 C++11 的标准库,你可以std::isnan进入<cmath>。)

在正常的程序流程中,只要您对数学输入进行健全检查,就不必担心 NaN。当然,你也可以换一种方式,只做数学计算,然后检查 NaN。:)

于 2012-10-05T19:45:12.747 回答
4

您看到的值是表示NaN不是数字。这些值显示为具有未定义值的浮点运算的结果。例如,0.0 / 0.0将产生一个 NaN。还有许多其他情况会产生 NaN。如果要确定浮点值是否为 NaN,可以对其进行测试:

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

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

于 2012-10-05T19:53:00.590 回答
0

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

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

if (output != output)  return 0; // or some default
else                   return output;
于 2012-10-05T20:17:39.297 回答
0

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

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

于 2012-10-05T21:22:38.163 回答