Операции над комплексными числами. Операции сравнения

   
На этом шаге мы рассмотрим особенности использования операций сравнения.

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

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

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

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

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

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

template <class T>
bool operator< (const std::complex<T>& c1, 
                         const std::complex<T>& c2)
{
  return std::abs(cl)<std::abs(c2) || 
          (std::abs(c1)==std::abs(c2) && 
           std::arg(c1)<std::arg(c2)); 
}

   
На следующем шаге мы рассмотрим арифметические операции.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий