为什么这个cout<< pow(-3,(1.0 / 3))返回-nan(ind)?

时间:2015-11-12 10:10:16

标签: c++ pow

为什么这样:

cout << pow(-3, (1.0 / 3))

返回

-nan(ind)

,而

pow(-3, 3)

pow(3, (1.0 / 3))

都可以正常工作吗?

5 个答案:

答案 0 :(得分:3)

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;
}

答案 1 :(得分:3)

浮点类型的

pow(x, y)可能实现为exp(y * ln(x))

ln(x)对于否定数字失败,或为零。

有关完整参考,请参阅http://en.cppreference.com/w/cpp/numeric/math/pow

答案 2 :(得分:3)

这是因为数学上负数的分数幂提供了一个复数。

对于std :: pow的

Reference声明&#34; pow(base, exp)返回NaN并且如果base是有限的并且是负的并且exp是有限且非整数则引发FE_INVALID。&#34;

答案 3 :(得分:0)

这是简单的数学:

  • pow(-3,3)==&gt; (-3) 3
  • pow(3,(1.0 / 3)==&gt; 3 1/3 = 3 √3
  • pow(-3,(1.0 / 3)==&gt;(-3) 1/3 = 3 √(-3)==&gt; Not可能,你不能拿负数的根。它是虚构的。

答案 4 :(得分:0)

您可以在cppreference.com战俘页面上找到特殊情况的列表:

按照math_errhandling中指定的方式报告错误。

如果base为有限且为负,而exp为有限且非整数,则将发生域错误,并且可能会发生范围错误。

如果base为零且exp为零,则可能会发生域错误。

如果base为零且exp为负,则可能会发生域错误或极点错误。

如果实现支持IEEE浮点算术(IEC 60559),

  • pow(+0, exp),其中exp是一个负整数,返回+∞并引发FE_DIVBYZERO
  • pow(-0, exp),其中exp是一个负整数,返回-∞并引发FE_DIVBYZERO
  • pow(±0, exp),其中exp为负,有限且是偶数或非整数,-返回+∞并引发FE_DIVBYZERO
  • pow(±0, -∞)返回+∞并可能提高FE_DIVBYZERO
  • pow(+0, exp),其中exp是一个正整数,返回+0
  • pow(-0, exp),其中exp是一个正整数,返回-0
  • pow(±0, exp)(exp是非整数正数或偶数正整数)返回+0
  • pow(-1, ±∞)返回1
  • pow(+1, exp)对于任何exp都返回1,即使exp为NaN
  • pow(base, ±0)对于任何底数都返回1,即使底数是NaN
  • pow(base, exp)返回NaN,如果base为负数且exp为有限且非整数,则返回FE_INVALID。
  • pow(base, -∞)对于任何| base | <1
  • 返回+∞
  • pow(base, -∞)对于任何| base |> 1
  • 返回+0
  • pow(base, +∞)对于任何| base | <1
  • 返回+0
  • pow(base, +∞)对于任何| base |> 1
  • 返回+∞ 如果exp是负整数,则
  • pow(-∞, exp)返回-0
  • 如果exp是负非整数甚至整数,则
  • pow(-∞, exp)返回+0
  • pow(-∞, exp)如果exp是一个正整数,则返回-∞
  • 如果exp是非整数甚至整数的整数,则
  • pow(-∞, exp)返回+∞
  • pow(+∞, exp)对于任何负数返回+0
  • pow(+∞, exp)对于任何正数返回+∞ 除非上面指定,否则如果参数为NaN,则返回NaN