Я пытаюсь создать комплексную бесконечность, равную Inf+Inf*j, где j — комплексная переменная. Когда я делаю это:
#include <complex>
#include <limits>
using std;
...
complex<double> attempt1 =
complex<double>( numeric_limits<double>::infinity(),
numeric_limits<double>::infinity() );
возвращает комплексное число (NaN + Inf*j).
Но
complex<double> attempt2 =
complex<double>( numeric_limits<double>::infinity() );
возвращает комплексное число (Inf + 0*j).
Также:
complex<double> attempt_at_imag_inf =
complex<double>(any_value_here, numeric_limits<double>::infinity());
возвращает комплексное число (NaN + Inf*j).
Кто-нибудь знает, что здесь происходит? Каждый раз, когда я пытаюсь получить бесконечность для мнимой части, NaN записывается в реальной части.
Вышеизложенное относится только к типам, поддерживающим NaN и Infinity, конечно. Я использую g++ v4.6.1. Я просмотрел заголовок numeric_limits, и нет никаких указаний на то, что это вообще должно происходить.
Чтобы поместить вышеизложенное в контекст, я на самом деле делаю это в частичной специализации numeric_limits для сложного. Большое спасибо за рассмотрение этой проблемы.
ПЕРЕСМОТР ИСХОДНОГО СООБЩЕНИЯ
Я предоставляю полную, но короткую программу для иллюстрации проблемы. Я также включил дополнительную информацию о том, как программа должна быть скомпилирована для получения результатов.
#include <iostream>
#include <complex>
#include <limits>
using namespace std;
int main(int argc, char* argv[])
{
complex<double> my_complex_inf =
complex<double>(numeric_limits<double>::infinity(),
numeric_limits<double>::infinity());
cout << "my_complex_inf = " << my_complex_inf << endl;
complex<double> attempt2 =
complex<double>( numeric_limits<double>::infinity() );
cout << "attempt2 = " << attempt2 << endl;
double any_value_here = 0;
complex<double> attempt_at_imag_inf =
complex<double>(0, numeric_limits<double>::infinity());
cout << "attempt_at_imag_inf = " << attempt_at_imag_inf << endl;
return 0;
}
Компиляция вышеуказанного в g++ версии 4.6.1 на Ubuntu с параметром -std=c++0x дает следующие результаты:
my_complex_inf = (nan,inf)
attempt2 = (inf,0)
attempt_at_imag_inf = (nan,inf)
Без параметра -std=c++0x результаты следующие:
my_complex_inf = (inf,inf)
attempt2 = (inf,0)
attempt_at_imag_inf = (0,inf)
Таким образом, Вопрос действительно в том, ПОЧЕМУ GNU g++ V4.6.1 ДАЙТЕ ОТВЕТЫ, КОГДА УКАЗАНО C++0x?
ПЕРЕСМОТР 2 К ИСХОДНОМУ СООБЩЕНИЮ
Я только что попробовал следующее в Octave (MATLAB-подобный числовой пакет):
a=inf + j*inf
И ответ:
a = NaN + Infi
Это именно то, что я вижу в своем коде C++11 (C++0x). Я не знаю, с чем скомпилирован Octave (я думаю, это комбинация C++ и FORTRAN), но если этот пакет возвращает результат, который я получаю, то я предполагаю, что это хорошо известное поведение.
Однако я просмотрел проект стандарта C++11 и не нашел упоминания об этом поведении.
РЕДАКЦИЯ 3 К ИСХОДНОМУ СООБЩЕНИЮ
Добавлена следующая строка
my_complex_inf.real(my_complex_inf.imag());
, чтобы сразу после построения my_complex_inf вернуть «правильный» ответ (inf, inf) при компиляции для C++11. К сожалению, теперь это двухэтапный процесс, и я не могу создать такую сложную бесконечность в функции constexpr.