- Tipos enteros
- Tipos reales (double, float)
- Números complejos (complex)
- Tipo string
- Estructuras, clases e interfaces
- Objeto de un array dinámico
- Matrices y vectores
- Conversión de tipos
- Tipo void y constante NULL
- Tipos personalizados
- Punteros a objetos
- Referencias Modificador & y palabra clave this
Tipos reales (double, float)
Los tipos reales (o tipos de punto flotante) representan valores que contienen la parte fraccionaria. En el lenguaje MQL5 existen dos tipos para los números con punto flotante. El modo de representar los números reales en la memoria del ordenador se rige por el estándar IEEE 754 y no depende de las plataformas, sistemas operativos y lenguajes de programación.
Tipo |
Tamaño en bytes |
Valor mínimo positivo |
Valor máximo |
Análogo en el lenguaje C++ |
---|---|---|---|---|
float |
4 |
1.175494351e-38 |
3.402823466e+38 |
float |
double |
8 |
2.2250738585072014e-308 |
1.7976931348623158e+308 |
double |
double
El tipo de número real double ocupa 64 bits (1 bit de signo, 11 bits de exponente y 52 bits de mantisa).
float
El tipo de número real float ocupa 32 bits (1 bit de signo, 8 bits de exponente y 23 bits de mantisa).
vector
Array numérico unidimensional del tipo double. La memoria para los datos se asigna dinámicamente. Las propiedades del vector se pueden recuperar usando métodos, y el tamaño del vector se puede cambiar. En las funciones de plantilla se puede utilizar la notación vector<double>.
vectorf
Array numérico unidimensional del tipo float, puede usarse en lugar de vector, si la pérdida de precisión no tiene importancia. En las funciones de plantilla se puede utilizar la notación vector<float>.
vectorc
Array numérico unidimensional del tipo complex, está diseñado para trabajar con números complejos. En las funciones de plantilla se puede utilizar la notación vector<complex>. Las operaciones sobre vectores de tipo vectorc aún no están implementadas.
matrix
Una matriz es un array numérico bidimensional del tipo double. La memoria para los elementos de la matriz se asigna dinámicamente. Las propiedades de la matriz se pueden obtener usando métodos, y el tamaño del vector se puede cambiar. En las funciones de plantilla se puede utilizar la notación matrix<double>.
matrixf
Array numérico bidimensional del tipo float, puede utilizarse en lugar de matrix si la pérdida de precisión no tiene importancia. En las funciones de plantilla se puede utilizar la entrada matrix<float>.
matrixc
Array numérico bidimensional del tipo complex, está diseñado para trabajar con números complejos. En las funciones de plantilla se puede utilizar la notación matrix<complex>. En estos momentos, las operaciones sobre matrices del tipo matrixc aún no están implementadas.
El nombre double significa que la precisión de estos números es dos veces más que la precisión de los números del tipo float. En mayoría de los casos el tipo double es más cómodo. En muchos casos la precisión limitada de los números float simplemente es insuficiente. La razón de utilizar todavía el tipo float se encuentra en el ahorro de la memoria durante el almacenamiento (es importante para las grandes cantidades de matrices de números reales).
Las constantes de punto flotante se componen de la parte entera, punto (.) y parte fraccionaria. La parte entera y fraccionaria es una sucesión de números decimales.
Ejemplos:
double a=12.111;
|
Existe el modo científico de escribir las constantes reales. A menudo esta modo de escribir es más compacto en comparación con la forma tradicional.
Ejemplo:
double c1=1.12123515e-25;
|
Hay que recordar que los números reales se almacenan en la memoria del ordenador con una cierta precisión limitada en el sistema binario, mientras que el sistema decimal es de uso general. Por eso muchos números que se escriben en el sistema decimal, en el sistema binario pueden ser escritos sólo en forma de fracción contínua.
Por ejemplo, en el ordenador los números 0.3 y 0.7 están representados por las fracciones contínuas, mientras que el número 0.25 se guarda de forma exacta porque es la potencia de 2.
Por esta razón no se recomienda de ninguna manera comparar la igualdad de dos números reales porque esta comparación no es correcta.
Ejemplo:
void OnStart()
|
Si en alguna ocasión es necesario comparar la igualdad de dos números reales, entonces se puede hacerlo de dos maneras distintas. El primer modo consiste en la comparación de diferencia entre dos números con un valor pequeño que marca la precisión de comparación.
Ejemplo:
bool EqualDoubles(double d1,double d2,double epsilon)
|
Cabe mencionar que el valor del parámetro epsilon en el ejemplo de arriba, no puede ser menos que la constante predeterminada DBL_EPSILON. El valor de esta constante es 2.2204460492503131e-016. Para el tipo float la constante correspondiente es FLT_EPSILON = 1.192092896e-07. El sentido de estos valores es siguiente: se trata del valor mínimo que satisface la condición 1.0+DBL_EPSILON != 1.0 (para los números del tipo float 1.0+FLT_EPSILON != 1.0).
El segundo modo supone la comparación de la diferencia normalizada de dos números reales con el valor cero. Es inutil comparar la diferencia de los números normalizados con el cero porque el resultado de cualquier operación matemática con los números normalizados no va a ser normalizado.
Ejemplo:
bool CompareDoubles(double number1,double number2)
|
Como resultado de algunas operaciones matemáticas del coprocesador se puede obtener un número real extendido, el que no se puede utilizar en las operaciones matemáticas y operaciones de comparación porque el resultado de ejecución de las operaciones con números reales extendidos no está definido. Por ejemplo, tratando de calcular el arcseno de 2 se obtiene el infinito negativo.
Ejemplo:
double abnormal = MathArcsin(2.0);
|
A parte del infinito negativo existe el infinito positivo y NaN (no es un número). Para determinar que el número es extendido se puede utilizar la función MathIsValidNumber(). Según el estándar IEEE ellos tienen una representación informática especial. Por ejemplo, el infinito positivo para el tipo double tiene la representación de bit 0x7FF0 0000 0000 0000.
Ejemplos:
struct str1
|
Véase también
DoubleToString, NormalizeDouble, Constantes de tipos numéricos