1.实数类型简介
在MQL4编程语言中,实数类型(或浮点类型)代表具有小数部分的值。有两种类型的浮点数,它们分别是double和float。这两种实数类型的表示方法由IEEE 754标准定义,与平台、操作系统或编程语言无关。
类型 | 字节大小 | 最小正值 | 最大值 | C++对应类型 |
---|---|---|---|---|
float | 4 | 1.175494351e-38 | 3.402823466e+38 | float |
double | 8 | 2.2250738585072014e-308 | 1.7976931348623158e+308 | double |
“double”表示这些数字的精度是float类型数字的两倍。在大多数情况下,double类型更方便。在许多情况下,float数字的精度不足。float类型仍在使用的原因是为了节省内存(这对大型实数数组很重要)。
浮点常量由整数部分、小数点(.)和小数部分组成。整数和小数部分都是十进制数字序列。
2.示例
double a=12.111;
double b=-956.1007;
float c =0.0001;
float d =16;
实数常量还有一种科学记数法的写法,往往这种记录方法比传统的更紧凑。
double e=1.12123515e-25;
double f=0.000000000000000000000000112123515; // 小数点后有24个零
实数在计算机内存中的存储精度在二进制系统中是有限的,而通常我们使用的是十进制表示法。这就是为什么许多在十进制系统中可以精确表示的数字在二进制系统中只能表示为无限小数的原因。
例如,数字0.3和0.7在计算机中表示为无限小数,而数字0.25则存储精确,因为它代表了二的幂。
因此,强烈建议不要比较两个实数的相等性,因为这样的比较是不准确的。
double g=3.0;
double x,y,z;
x=1/g;
y=4/g;
z=5/g;
if(x+y==z) Print("1/3 + 4/3 == 5/3");
else Print("1/3 + 4/3 != 5/3");
// 输出结果: 1/3 + 4/3 != 5/3
3.实数比较
如果你确实需要比较两个实数的相等性,你可以用两种不同的方法。第一种方法是对比两个数的差是否小于某个给定的阈值。这个阈值应该根据你的需求设定,一般情况下应该非常小。
double x=1.1111111;
double y=1.1111112;
double epsilon=0.00001;
if(MathAbs(x-y)<epsilon) Print("x is approximately equal to y");
else Print("x is not approximately equal to y");
// 输出结果: x is approximately equal to y
在这个例子中,我们计算x和y的差的绝对值,然后检查它是否小于我们设定的阈值epsilon。如果小于这个值,那么我们就可以认为x和y是近似相等的。
另一种方法是使用MQL4内置的IsEqual
函数,这个函数接收两个实数和一个精度值作为参数,然后比较这两个实数是否在给定的精度范围内相等。
double x=1.1111111;
double y=1.1111112;
int precision=5;
if(IsEqual(x,y,precision)) Print("x is approximately equal to y");
else Print("x is not approximately equal to y");
// 输出结果: x is approximately equal to y
在这个例子中,我们将精度设为5,这表示比较的小数点后5位。如果x和y在小数点后5位内相等,那么IsEqual
函数就会返回true
。
总的来说,在编程中使用浮点数时需要小心。不建议直接比较两个浮点数的相等性,因为浮点数的存储和表示在计算机中是不精确的。如果你确实需要比较浮点数,可以使用上面提到的两种方法。