Тип complex

Встроенный тип complex представляет из себя структуру с двумя полями типа double:

struct complex 

   double      real;   // вещественная часть 
   double      imag;   // мнимая часть 
};

Мы описываем её в разделе о конвертации типов, потому что она "превращает" два числа double в новую сущность, в чем-то по похожему принципу, как структуры "превращаются" в массивы байтов и обратно. Кроме того, было бы в принципе затруднительно представлять этот тип без предварительного описания структур.

Структура complex не имеет конструктора, поэтому создавать комплексные числа следует с помощью списка инициализации.

complex c = {reim};

Для комплексных чисел на данный момент доступны только простые арифметические операции и операции сравнения: =, +, -, *, /, +=, -=, *=, /=, ==, !=. Поддержка математических функций будет добавлена позднее.

Внимание! Комплексные переменные не могут быть описаны как входные (с помощью ключевого слова input) для MQL-программы.

Для описания комплексных (мнимых частей) констант используется суффикс 'i', например:

const complex x = 1 - 2i;
const complex y = 0.5i;

В следующем примере (скрипт Complex.mq5) создается комплексное число и возводится в квадрат.

input double r = 1;
input double i = 2;
   
complex c = {ri};
   
complex mirror(const complex z)
{
   complex result = {z.imagz.real}; // обмен местами реальной и мнимой частей
   return result;
}
   
complex square(const complex z

   return (z * z);
}   
   
void OnStart()
{
   Print(c);
   Print(square(c));
   Print(square(mirror(c)));
}

С параметрами по умолчанию скрипт выведет строки:

c=(1,2) / ok
square(c)=(-3,4) / ok
square(mirror(c))=(3,4) / ok

Здесь пары чисел в круглых скобках — это строковое представление комплексного числа.

Тип complex может передаваться по значению в качестве параметра MQL-функций (в отличие от обычных структур, которые передаются только по ссылке). Для функций, импортируемых из DLL, тип complex должен передаваться только по ссылке.