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

 

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?

 
double n = -1/MathPow(5.5, 0.2);
Print(n);
 
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

 
Aleksey Nikolayev:

en R:

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

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

¿Quizás las patas están creciendo por el hecho de que no se puede sacar una raíz par de un número negativo? Ya estoy algo confundido... Y lo más importante, ¿cómo evitarlo?

 
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
 
Roman:

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

 
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.

 
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.

 
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í)

 
Corrígeme si lo he entendido mal, ¿quizás haya una solución fuera de los números complejos después de todo?
 
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.