10

看一下自爆的代码:

#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)。

谁能给个解释?

4

2 回答 2

6

根据std::pow 文档

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

在您的代码中,由于复数0 + 0 *i仍为 0,因此 base 和 exp 都等于 0。所以NaN似乎是意料之中的。

由@Fred Larson 提供,并根据std::complex 的重载 std::pow

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

于 2013-06-28T14:51:01.673 回答
4

正如 Fred Larson 正确指出的那样,文档中说:

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

从数学上讲,这是有道理的,因为我们有一个矛盾的情况,N^0应该总是10^N应该总是0for N > 0,所以你也不应该在数学上对这个结果有任何期望。这篇Wolfram Alpha论坛帖子介绍了更多细节。

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

于 2013-06-28T15:28:16.630 回答