为什么(0 + 0i)^ {0} ==(nan,nan)在c ++中

时间:2013-06-28 14:44:00

标签: c++ numeric nan complex-numbers exponential

看看代码自爆:

#include <complex>
#include <iostream>

int main()
{
    std::cout << std::pow( std::complex<double>(0,0), std::complex<double>(0,0) ) << "\n";
    std::cout << std::pow( std::complex<double>(0,0), double(0) ) << "\n";

    return 0;
}

g ++(4.8.1)给出

的输出
(nan,nan)
(-nan,-nan)

而clang ++(3.3)给出了

的输出
(-nan,-nan)
(-nan,-nan)

但我期待(1.0,0.0)。

有人可以解释一下吗?

2 个答案:

答案 0 :(得分:6)

根据std::pow documentation

  

返回值
  由权力提升的基数(exp或iexp)   如果base为0且exp小于或等于0,则发生域错误在这种情况下返回NAN。   [...]

在您的代码中,由于复数0 + 0 *i仍为0,因此基数为0且exp均为0.因此,NaN似乎是预期的。

由@Fred Larson提供,并根据overloaded std::pow for std::complex

  

计算复数x被提升到复数幂y。该操作定义为exp(y·log(x))。沿负实轴存在分支切口。    pow(0,0)的结果是实现定义的。

答案 1 :(得分:4)

正如Fred Larson正确points out documentation所说:

  

pow(0,0)的结果是实现定义的。

数学上这是有道理的,因为我们有一个矛盾的情况,N^0应该始终是10^N应始终是0 N > 0,所以你对于这个结果,数学上也没有任何期望。这篇Wolfram Alpha论坛帖子详细介绍了一些内容。

复数的虚部不是zero的情况是more complex的情况。如果x中的x^y是真实的,那么它也应该是未定义的,但如果x有一个虚构的组件,那么看起来它不再是未定义的。