我理解为什么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.
试图使用在线工具编译它,但显示了相同的结果:
答案 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(不是数字)的自然数学结果,因为在这种情况下它不是实数。要了解更多细节,你必须学习很多数论。