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

Fen*_*ang 10 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;
}
Run Code Online (Sandbox Code Playgroud)

g ++(4.8.1)给出了输出

(nan,nan)
(-nan,-nan)
Run Code Online (Sandbox Code Playgroud)

而clang ++(3.3)给出了一个输出

(-nan,-nan)
(-nan,-nan)
Run Code Online (Sandbox Code Playgroud)

但我期待(1.0,0.0).

任何人都可以解释一下吗?

tao*_*ocp 6

根据std :: pow文档


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

在你的代码中,你有两个基数为0和exp等于0,因为复数0 + 0 *i仍然是0.所以NaN似乎是预期的.

由@Fred Larson礼貌,并根据std :: pow为std :: complex重载

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