看看代码自爆:
#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)。
有人可以解释一下吗?
答案 0 :(得分:6)
返回值
由权力提升的基数(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
应该始终是1
但0^N
应始终是0
N > 0
,所以你对于这个结果,数学上也没有任何期望。这篇Wolfram Alpha论坛帖子详细介绍了一些内容。
复数的虚部不是zero
的情况是more complex的情况。如果x
中的x^y
是真实的,那么它也应该是未定义的,但如果x
有一个虚构的组件,那么看起来它不再是未定义的。