-nan在C ++中意味着什么?为什么pow(-4,-2.1)返回-nan?

时间:2013-12-08 11:38:29

标签: javascript c++ c++11

我理解为什么JavaScript中有Math.pow(a, b) is NaN when a is a negative number and b is a non-integer。同样的事情正在发生in other programming languages

但是,C ++呢?

在JavaScript Math.pow(-4, -2.1)中返回NaN时,在C ++中pow (-4, -2.1)会返回-nan。为什么呢?


示例:

#include <iostream>
#include <math.h>

using namespace std;

int main () {
    cout << "(4)  ^ (2.1)  = " << pow (4,  -2.1) << endl; // 0.0544094
    cout << "(-4) ^ (-2.1) = " << pow (-4, -2.1) << endl; // -nan
    cout << "(-4) ^ (2.1)  = " << pow (-4,  2.1) << endl; // -nan
    return 0;
}

输出:

(4)  ^ (2.1)  = 0.0544094
(-4) ^ (-2.1) = -nan
(-4) ^ (2.1)  = -nan

我使用g++编译了代码。

$ g++ --version
g++ (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

试图使用在线工具编译它,但显示了相同的结果:

2 个答案:

答案 0 :(得分:5)

我能找到的唯一相关引用来自n1570

  

实现可以给出零和不是浮点的值   数字(如无穷大和NaNs)是一个标志或可能留下它们   无符号。无论这些值是否未签名,都有任何要求   检索标志的国际标准应产生   未指明的标志,以及任何设置标志的要求应为   忽略。

答案 1 :(得分:2)

  

如果x是有限负的并且y是有限的但不是整数值,则它   导致域错误。如果x和y都为零,它也可能导致a   域错误。如果x为零且y为负,则可能导致域   错误或极点错误(或无错误,具体取决于库   实现)。如果该功能也可能导致范围错误   结果太大或太小,无法用值表示   返回类型。

在你的情况下

x = -4且y = -2.1,因此x是有限负的,y是有限的但不是整数值。现在再次阅读引用文本;)

取自here

编辑:函数的域是定义函数的集合。如果第一个参数是整数,pow期望第二个参数为整数。图书馆清楚地说明了这种情况。

让我这样说:

-4^-2.1 = (-1)^-2.1 * 4^-2.1

的价值应该是什么?
(-1)^2.1

sqrt(-1)

未定义实数

sqrt(-1) = i

表示复数。显然,pow的返回值是一个实数。现在无法计算

-1^-0.1

关于实数的集合,因此它是NaN(不是数字)的自然数学结果,因为在这种情况下它不是实数。要了解更多细节,你必须学习很多数论。