【发布时间】:2015-11-12 10:10:16
【问题描述】:
为什么会这样:
cout << pow(-3, (1.0 / 3))
返回
-nan(ind)
而
pow(-3, 3)
和
pow(3, (1.0 / 3))
两者都工作正常?
【问题讨论】:
为什么会这样:
cout << pow(-3, (1.0 / 3))
返回
-nan(ind)
而
pow(-3, 3)
和
pow(3, (1.0 / 3))
两者都工作正常?
【问题讨论】:
这是因为从数学上讲,负数的小数幂会产生一个复数。
Reference for std::pow 声明“pow(base, exp) 返回 NaN 并在 base 为有限且为负且 exp 为有限且非整数时引发 FE_INVALID。”
【讨论】:
浮点类型的pow(x, y) 可能实现为exp(y * ln(x))。
ln(x) 因负数或零而失败。
【讨论】:
pow 函数仅用于正数。
查看pow function的手册页:
如果 x 是小于 0 的有限值,并且 y 是有限非整数,则 a 发生域错误,并返回一个 NaN。
要获得数字的力量,你可以这样尝试:
int main() {
int exp;
float base, power = 1;
cout << "Base and exponent : ";
cin >> base >> exp;
while (exp != 0) {
power *= base;
--exp;
}
cout << "Output = " << power;
return 0;
}
【讨论】:
这是简单的数学:
【讨论】:
pow(double, double) 不支持。而且您的第二个陈述不正确,有三个立方根:您只选择了实线中的那个。
您可以在cppreference.com pow 页面上找到特例列表:
按照 math_errhandling 中的规定报告错误。
如果 base 是有限且负数,exp 是有限且非整数,则会发生域错误并且可能会发生范围错误。
如果 base 为零且 exp 为零,则可能会发生域错误。
如果 base 为 0 且 exp 为负数,则可能会出现域错误或极点错误。
如果实现支持 IEEE 浮点算法 (IEC 60559),
pow(+0, exp),其中 exp 是一个负奇数,返回 +∞ 并提高 FE_DIVBYZEROpow(-0, exp),其中 exp 是一个负奇数,返回 -∞ 并提高 FE_DIVBYZEROpow(±0, exp),其中 exp 是负数,有限,并且是偶数或非整数, - 返回 +∞ 并引发 FE_DIVBYZEROpow(±0, -∞) 返回 +∞ 并可能提高 FE_DIVBYZEROpow(+0, exp),其中exp为奇数正整数,返回+0pow(-0, exp),其中 exp 是一个正奇数,返回 -0pow(±0, exp),其中 exp 为正非整数或正偶整数,返回 +0pow(-1, ±∞) 返回 1pow(+1, exp) 对任何 exp 返回 1,即使 exp 为 NaNpow(base, ±0) 为任何基数返回 1,即使基数是 NaNpow(base, exp) 如果 base 为有限且为负且 exp 为有限且非整数,则返回 NaN 并引发 FE_INVALID。pow(base, -∞) 为任何 |base| 返回 +∞
pow(base, -∞) 对任何 |base|>1 都返回 +0pow(base, +∞) 为任何 |base| 返回 +0
pow(base, +∞) 为任何 |base|>1pow(-∞, exp) 如果 exp 为负奇数,则返回 -0pow(-∞, exp) 如果 exp 是一个负的非整数甚至整数,则返回 +0pow(-∞, exp) 如果 exp 是正奇数,则返回 -∞pow(-∞, exp) 如果 exp 是正非整数甚至整数,则返回 +∞pow(+∞, exp) 为任何负数返回 +0pow(+∞, exp) 对任何正的 exp 返回 +∞
除非上面指定,如果任何参数是 NaN,则返回 NaN【讨论】: