why (0+0i)^{0} == (nan, nan) in c++

五迷三道 提交于 2019-12-18 21:13:06

问题


take a look at the code blew:

#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) gives an output of

(nan,nan)
(-nan,-nan)

while clang++(3.3) gives an out put of

(-nan,-nan)
(-nan,-nan)

But I am expecting (1.0, 0.0).

Can anyone give an explanation?


回答1:


According to std::pow documentation

Return value
base raised by power (exp or iexp).
Domain error occurs if base is 0 and exp is less than or equal to ​0​. NAN is returned in that case. [...]

In your code, you have both base with 0 and exp equal to 0 since the complex number 0 + 0 *i is still 0. So NaN seems expected.

By courtesy of @Fred Larson, and according to overloaded std::pow for std::complex

Computes complex x raised to a complex power y. The operation is defined as exp(y · log(x) ). A branch cut exists along the negative real axis. The result of pow(0, 0) is implementation-defined.




回答2:


As Fred Larson correctly points out the documentation says:

The result of pow(0, 0) is implementation-defined.

Mathematically this makes sense since we have a contradictory situation where N^0 should always be 1 but 0^N should always be 0 for N > 0, so you should have no expectations mathematically as to the result of this either. This Wolfram Alpha forum posts goes into a bit more details.

The case where the imaginary portion of the complex number is not zero is more complex situation. If the x in x^y is real then it should also be undefined but if x has an imaginary component then it looks like it is no longer undefined.



来源:https://stackoverflow.com/questions/17367415/why-00i0-nan-nan-in-c

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!