взгляните на код:
#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).
Кто-нибудь может дать объяснение?
В соответствии с стандартная документация
Возвращаемое значение
база поднята силой (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) определяется реализацией.
Как правильно Фред Ларсон указывает на то документация говорит:
Результат pow (0, 0) определяется реализацией.
Математически это имеет смысл, поскольку мы имеем противоречивую ситуацию, когда N^0
всегда должен быть 1
но 0^N
всегда должен быть 0
за N > 0
так что у вас не должно быть математических ожиданий относительно результата этого тоже. это вольфрам Альфа сообщения на форуме входят в немного больше деталей.
Случай, когда мнимая часть комплексного числа не zero
является более сложный ситуация. Если x
в x^y
реально, то оно также должно быть неопределенным, но если x
имеет мнимый компонент, то, похоже, он больше не является неопределенным.