Тип данных complex стандартной библиотеки языка C++

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование

/p>

Однако похожая запись со знаком равенства ошибочна:

std::complex

с2 = std::polar(4.2.0.75); // ОШИБКА

Эта проблема рассматривается далее.

Вспомогательная функция conj() позволяет создать комплексное число, инициализированное значением, сопряженным с другим комплексным числом (то есть комплексным числом с противоположным знаком мнимой части):

std: :complex c2(conj(c1));

// c2 инициализируется как

// complex(1.1.-5.5)

2.4 Неявные преобразования типов

Конструкторы специализированных версий для типов float double и long double спроектированы так, чтобы безопасные преобразования типов (например, complex) были:

std::complex cd1 =cf: // OK: безопасное преобразование

std::complex cd2 = сld: // ОШИБКА: нет неявного преобразования

std::complex cd3(cld); // OK: явное преобразование

He существует конструкторов, создающих комплексное число по другим комплексным типам. В частности, нельзя преобразовать complex iелым типом в complex с типом float, double или long double. Впрочем, преобразования можно выполнять при передаче вещественной и мнимой частей в отдельных аргументах:

std::complex cd6(ci.real () .ci .imag()); // OK

К сожалению, операторы присваивания позволяют выполнять небезопасные преобразования. Они определены в виде шаблонов для всех типов, поэтому присваивание допустимо для любых комплексных типов (при возможности пре-образования типа значения):

std: :complex ci;

Эта проблема также относится к функциям polar() и conj(). Например, следующая запись работает нормально:

std::complex c2(std::polar(4.2.0.75)); // OK

С другой стороны, запись со знаком = не работает:

std::complex с2 = std::polar(4.2.0.75); // ОШИБКА

Дело в том, что выражение std::polar(4.2,0.75) создает временный объект complex не определено.

.5 Доступ к данным

В таблице 3 перечислены функции получения атрибутов комплексных чисел.

Таблица 3- Функции получения атрибутов.

Выражение Описаниеc.real()Возвращает значение вещественной части (функция класса)real(c)Возвращает значение вещественной части (глобальная функция)c.lmag()Возвращает значение мнимой части (функция класса)imag(c)Возвращает значение мнимой части (глобальная функция)abs(c)Возвращает модуль с ()norm(c)Возвращает квадрат модуля с(c.real()2+c.imag()2)arg(c)Возвращает фазовый угол в полярном представлении c(?); эквивалент atan2(c.imag(),c.real())

Функции real() и imag() позволяют только прочитать значения вещественной и мнимой частей. Чтобы изменить любую из частей комплексного числа, необходимо присвоить ему новое значение. Например, следующая команда присваивает мнимой части с значение 3.7: std::complex с;

... с = std::complex(c.real().3.7);

2.6 Операции сравнения

Из всех операций сравнения для комплексных чисел определены только проверки на равенство и на неравенство. Операторы == и != определены как глобальные функции, поэтому один из операндов может быть скалярной величиной. В этом случае операнд интерпретируется как вещественная часть, а мнимой части комплексного числа присваивается значение по умолчанию для данного типа (обычно 0).

Другие операции сравнения (например, с оператором < и т. д.) для класса complex не определены. Хотя в принципе для комплексных чисел можно определить порядок сортировки, результат получается недостаточно интуитивным и не приносит особой практической пользы. Например, сравнивать комплексные числа на основании модулей бессмысленно, поскольку два разных комплексных числа (например, 1 и -1) могут иметь одинаковые модули. Конечно, можно изобрести специальный критерий сортировки, например, для двух комплексных чисел c1 и с2 iитать, что c1<c2 при выполнении условия |c1|<|c2|, а в случае совпадения модулей - при выполнении условия arg(c1)<arg(c2). Тем не менее такие искусственные критерии не обладают математическим смыслом.

Таблица 4- Операции сравнения для класса complex<>.

Выражение Описаниеc1 == c2Проверка на равенство c1 и с2 (c1.real()==c2.real() && c1.imag()==c2.imag())с== 1.7Проверка на равенство c1 и 1.7 (c1.real()==1.7 &&c1.imag()==0.0)1.7 == сПроверка на равенство 1.7 и с (c1.real0==1.7 && c1.imag()==0.0)с1 != с2Проверка на неравенство c1 и с2 (c1.real()!=c2.real() || c1.imag()!=c2.imag())с != 1.7Проверка на неравенство c1 и 1.7 (c1.real()!=1.7 || c1.imag()!=0.0)1.7 != сПроверка на неравенство 1.7 и с (c1.real()!=1.7 || c1.imag()!=0.0)

Из этого следует, что тип complex не может быть типом элементов ассоциативных контейнеров (без определения пользовательского критерия сортировки). Дело в том, что для сортировки элементов по умолчанию ассоциативные контейнеры используют объект функции less<>, который вызывает оператор <

Определение пользовательского оператора < позволяет сортировать комплексные числа и использовать их в ассоциативных контейнерах. Нельзя нарушать стандартное пространство имен. Пример:

Листинг 5-правильное пространство имен

template

bool operator& c1.

const std::complex& c2)

{std::abs(cl)<std;;abs(c2) ||

(std::abs(cl)==std::abs(c2) &&

std: :arg(cl)<std::arg(c2));

}

.7 Арифметические операции

Для комплексных чисел определены четыре базовые арифметические операции, а также операции изменения знака.

Таблица 5- Ариф