¿Por qué hay tantos trucos con los títulos?

Andrey Azatskiy  

Necesito escribir una función que funcione con potencias y en el proceso he descubierto algo interesante:

Si sustituyo un número fraccionario negativo a un grado fraccionario negativo, MQL5 escribe -nan.

double n = MathPow(-5.5,-0.2);

Lo he comprobado en C++ y he obtenido el mismo resultado (no sé qué versión del lenguaje se ha utilizado, porque me ha dado pereza compilar y sólo lo he probado con cpp.sh).

#include <iostream>
#include <string>
#include <tgmath.h>

int main()
{
    double _pow = pow(-5.5,-0.2);    
  
  std::cout << _pow << "\n";
}


¡Creo que no hay ningún error en MQL5 si la respuesta es la misma en pluses! Pero la pregunta es ¿por qué ocurre así? Si hacemos las cuentas, la respuesta debería estar ahí. Matemáticamente, un número negativo es igual a uno dividido por el mismo número a la potencia positiva. En otras palabras:

-5.5^-0.2 = 1/(-5.5^0.2) = −0,711094733;

Y la calculadora del ordenador lo confirma. Entonces, ¿qué es este truco de las calificaciones?

Roman  
double n = -1/MathPow(5.5, 0.2);
Print(n);
Aleksey Nikolayev  
Andrey Azatskiy:

Necesito escribir una función que funcione con potencias y en el proceso he descubierto algo interesante:

Si sustituyo un número fraccionario negativo a una potencia fraccionaria negativa, MQL5 escribe -nan.

Lo he comprobado en C++ y he obtenido el mismo resultado (no sé qué versión del lenguaje se ha utilizado, porque me ha dado pereza compilar y sólo lo he probado con cpp.sh).


Los pluses dan la misma respuesta, ¡no hay error en MQL5! Pero, ¿cuál es la razón de tal respuesta? Si utilizamos las matemáticas, la respuesta debería estar dada. Matemáticamente, un número a la potencia negativa es igual a uno dividido por el mismo número a la potencia positiva. En otras palabras:

Y la calculadora del ordenador lo confirma. ¿Qué es eso de los grados?

En R:

(-5,5)^-0,2=NaN

-5.5^-0.2=-(5.5^-0.2)=-0.7110947

Igor Makanu  
Andrey Azatskiy:

Y lo más importante, ¿cómo evitarlo?

m = 2

n = 10

double result = pow(pow(-5.5,2.0),-0.1); 
Print("result = ",result);                      //result = 0.7110947333604484
sin paréntesis, el signo menos puede interpretarse de otra manera, imho
Andrey Azatskiy  
Roman:

Habrá un problema con las señales. La raíz de una potencia par es siempre positiva

Roman  
Andrey Azatskiy:

Habrá un problema con las señales. La raíz de una potencia par es siempre positiva.

En la calculadora donde el grado es fraccionario

1/(-5.5 ^ -0.2)
-0,7110947333604484236326007791589

En mql donde el grado es fraccionario

double n = 1/MathPow(-5.5, -0.2);
Print(n);

zero divide in 'Pow.mq5' 

En mql donde el grado es entero.

double n = 1/MathPow(-3.0, -3.0);
Print(n);

-27.0

Conclusión, la función no cuenta correctamente las potencias fraccionarias, y devuelve la división cero.

Andrey Azatskiy  
Igor Makanu:

m = 2

n = 10

sin paréntesis, el signo menos puede interpretarse de forma diferente, en mi opinión

Gracias por la respuesta, pero en general si tomamos una solución aritméticamente correcta, parece que sólo se pueden utilizar números complejos para implementar dicha solución... En su método propuesto es necesario dividir el grado para que el valor subyacente tenga siempre un grado positivo y la respuesta sea siempre positiva. Pero si se prescinde de este encaje - llegamos sólo a los números complejos, porque según el modelo algebraico generalmente aceptado hasta donde yo sé (no soy matemático de formación) - la raíz de un número negativo será un número complejo.

Andrey Azatskiy  
Roman:

En mql donde está el grado fraccionario

En mql donde el grado es fraccionario

En mql donde el grado es entero.

Conclusión, la función no cuenta correctamente los grados fraccionarios, y devuelve una división cero.

La función es correcta. La matemática estándar no funciona allí)

Andrey Azatskiy  
Corrígeme si lo he entendido mal, ¿quizás haya una solución fuera de los números complejos después de todo?
Roman  
Andrey Azatskiy:

La función es correcta. Las matemáticas estándar no encajan ahí)

-0,2 no es cero para devolver un error de división por cero.

Razón de la queja: