数学“pow”函数返回 -1.#IND。-1.#IND 是什么类型的错误值,如何检测 if 语句中的错误?
4 回答
-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。:)
您看到的值是表示NaN或不是数字。这些值显示为具有未定义值的浮点运算的结果。例如,0.0 / 0.0
将产生一个 NaN。还有许多其他情况会产生 NaN。如果要确定浮点值是否为 NaN,可以对其进行测试:
if (std::isnan(value)) {
...
}
作为浮点运算的结果,很少有其他特殊值可以产生,例如,正无穷或负无穷大,并且也有<cmath>
针对这些的测试。
-1#IND 通常在代码中某处有 /0 时发生。通过使用 -ve 指数检查 0 的 pow 函数中的所有分母或基数来防止它。
完成除法或 pow 操作后,如果您没有检查输入,请使用以下命令检查输出:
if (output != output) return 0; // or some default
else return output;
-1.#IND
是 NaN,而不是数字。NaN 的出现有很多原因。0.0/0.0 等表达式是不确定的;如果你尝试,你会得到一个 NaN。-1(或任何负实数)的平方根是纯虚数;使用 float 或 doublesqrt
函数,你会得到一个 NaN 结果。这里的结果不是不确定的,但也不是真实的。这是一个NaN。
另一种表达方式sqrt(-1.0)
是pow(-1.0, 0.5)
。这也会生成一个 NaN。