复数类型

内置 complex 类型是一种具有两个 双精度浮点数类型字段的结构体:

struct complex 

   double      real;   // real part 
   double      imag;   // imaginary part 
};

该结构体在类型转换章节中介绍过,因为它将两个 double 数字“转换”为一个新实体,类似于 结构体转换为字节数组及相反转换的方式。此外,如果不先描述结构体,读者可能很难理解这个类型。

complex 结构体没有构造函数,因此复数必须使用初始化列表创建。

complex c = {reim};

对于复数,目前只能执行简单算术和比较运算:=、+、-、*、/、+=、-=、*=、/=、==、!=。对于 数学函数 的支持将在今后增加。

注意!不能将复数变量声明为 MQL 程序的输入(使用 input 关键字)。

后缀 '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}; // swap real and imaginary parts
   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 类型应仅通过引用传递。