числовой — почему (0 + 0i) ^ {0} == (nan, nan) в переполнении стека

взгляните на код:

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

Кто-нибудь может дать объяснение?

10

Решение

В соответствии с стандартная документация

Возвращаемое значение
база поднята силой (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) определяется реализацией.

6

Другие решения

Как правильно Фред Ларсон указывает на то документация говорит:

Результат pow (0, 0) определяется реализацией.

Математически это имеет смысл, поскольку мы имеем противоречивую ситуацию, когда N^0 всегда должен быть 1 но 0^N всегда должен быть 0 за N > 0так что у вас не должно быть математических ожиданий относительно результата этого тоже. это вольфрам Альфа сообщения на форуме входят в немного больше деталей.

Случай, когда мнимая часть комплексного числа не zero является более сложный ситуация. Если x в x^y реально, то оно также должно быть неопределенным, но если x имеет мнимый компонент, то, похоже, он больше не является неопределенным.

4