Создание комплексной бесконечности с помощью std::complex<T> в C++

Я пытаюсь создать комплексную бесконечность, равную 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 для complex. Большое спасибо за рассмотрение этой проблемы.

ПЕРЕСМОТР НА ОРИГИНАЛЬНЫЙ ПОСТ

Я предоставляю полную, но короткую программу для иллюстрации проблемы. Я также включил некоторую уточняющую информацию о том, как программа должна быть скомпилирована для получения результатов.

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

3 ответа

Вы сталкиваетесь с тем, что C++11 (и C11) задают комплексные числа и запутываются.

По сути, в модели, предписанной спецификацией, есть только одна бесконечность (представленная (inf,0)), и попытка поместить "бесконечность" в мнимую часть комплекса приводит к Nan, потому что это не имеет смысла в эта модель.

Скалярное Inf, преобразованное в комплекс, - это inf+0 j. Это правильно выше. Скалярное Inf-смещение в комплексной плоскости подразумевает вращение и не рассчитывается, поэтому Nan верна. В чем проблема снова?

"Там будут драконы."

В основной строке (gcc-4.8) я получаю с -std= C++0x ожидаемый (без -std) ответ:

my_complex_inf = (inf,inf)
attempt2 = (inf,0)
attempt_at_imag_inf = (0,inf)

gcc-4.6.3 с -std-C++11 дает неожиданный ответ:

my_complex_inf = (-nan,inf)
attempt2 = (inf,0)
attempt_at_imag_inf = (-nan,inf)

Я думаю, что конструкторы должны просто установить действительные и мнимые типы в соответствии с соответствующими аргументами. Там не должно быть nan,

Другие вопросы по тегам