El valor absoluto de un número

La API de MQL5 proporciona la función MathAbs, que puede eliminar el signo menos del número si existe. Por lo tanto, no es necesario codificar manualmente equivalentes más largos como éste:

if(x < 0x = -x;

numeric MathAbs(numeric value) ≡ numeric fabs(numeric value)

La función devuelve el valor absoluto del número que se le pasa, es decir, su módulo. El argumento puede ser un número de cualquier tipo. En otras palabras: la función está sobrecargada para char/uchar, short/ushort, int/uint, long/ulong, float y double, aunque para los tipos sin signo los valores son siempre no negativos.

Al pasar una cadena, se convertirá implícitamente en un número double, y el compilador generará una advertencia pertinente.

El tipo del valor de retorno es siempre el mismo que el tipo del argumento, por lo que el compilador puede necesitar convertir el valor al tipo de la variable receptora si los tipos son diferentes.

Encontrará ejemplos de uso de las funciones en el archivo MathAbs.mq5.

void OnStart()
{
   double x = 123.45;
   double y = -123.45;
   int i = -1;
   
   PRT(MathAbs(x)); // 123.45, number left "as is"
   PRT(MathAbs(y)); // 123.45, minus sign gone 
   PRT(MathAbs(i)); // 1, int is handled naturally
   
   int k = MathAbs(i);  // no warning: type int for parameter and result
   
   // situations with warnings:
   // double to long conversion required
   long j = MathAbs(x); // possible loss of data due to type conversion
   
   // need to be converted from large type (4 bytes) to small type (2 bytes)
   short c = MathAbs(i); // possible loss of data due to type conversion
   ...

Es importante tener en cuenta que convertir un entero con signo en un entero sin signo no equivale a tomar el módulo de un número:

   uint u_cast = i;
   uint u_abs = MathAbs(i);
   PRT(u_cast);             // 4294967295, 0xFFFFFFFF
   PRT(u_abs);              // 1

Tenga en cuenta también que el número 0 puede tener signo:

   ...
   double n = 0;
   double z = i * n;
   PRT(z);               // -0.0
   PRT(MathAbs(z));      //  0.0
   PRT(z == MathAbs(z)); // true
}

Uno de los mejores ejemplos de cómo utilizar MathAbs es comprobar la igualdad de dos números reales. Como es sabido, los números reales tienen una precisión limitada para representar valores, que puede degradarse aún más en el curso de cálculos largos (por ejemplo, la suma de diez valores 0.1 no da exactamente 1.0). La condición estricta value1 == value2 puede dar false en la mayoría de los casos, cuando la igualdad puramente especulativa debería mantenerse.

Por lo tanto, para comparar valores reales, se suele utilizar la siguiente notación:

MathAbs(value1 - value2) < EPS

donde EPS es un pequeño valor positivo que indica una precisión (véase un ejemplo en la sección operaciones de comparación).