Por que existem tais truques com graus?

 

Preciso escrever uma função que funcione com poderes e, no processo, descobri algo interessante:

Se eu substituir um número fracionário negativo por um poder fracionário negativo, a MQL5 escreve -nan.

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

Verifiquei em C++ e obtive o mesmo resultado (não sei qual versão do idioma foi usada, porque eu era preguiçoso demais para compilar e acabei de testá-lo pelo cpp.sh).

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

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


Eu acho que não há erro na MQL5 se a resposta for a mesma em pluses! Mas a questão é por que isso acontece dessa maneira? Se fizermos as contas, então a resposta deve estar lá. Matematicamente, um número negativo é igual a um dividido pelo mesmo número pelo poder positivo. Em outras palavras:

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

E a calculadora no computador o confirma. Então, qual é este truque com as notas?

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

Preciso escrever uma função que funcione com poderes e, no processo, descobri algo interessante:

Se eu substituir um número fracionário negativo por um poder fracionário negativo, a MQL5 escreve -nan.

Verifiquei em C++ e obtive o mesmo resultado (não sei qual versão do idioma foi usada, porque eu era preguiçoso demais para compilar e acabei de testá-lo pelo cpp.sh).


Os prós dão a mesma resposta, não há erro na MQL5! Mas qual é a razão de tal resposta? Se utilizarmos a matemática, a resposta deve ser dada. Matematicamente, um número para o poder negativo é igual a um dividido pelo mesmo número para o poder positivo. Em outras palavras:

E a calculadora no computador o confirma. Então o que é isso de graus?

Em R:

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

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

 
Aleksey Nikolayev:

em R:

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

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

Talvez as pernas estejam crescendo a partir do fato de que não se pode tirar uma raiz sequer de um número negativo ? Já estou um pouco confuso... E o mais importante, como contornar isso ?

 
Andrey Azatskiy:

E o mais importante, como contornar isso ?

m = 2

n = 10

double result = pow(pow(-5.5,2.0),-0.1); 
Print("result = ",result);                      //result = 0.7110947333604484
sem parênteses, o sinal de menos pode ser interpretado de forma diferente, imho
 
Roman:

Haverá um problema com os sinais. A raiz de um poder uniforme é sempre positiva

 
Andrey Azatskiy:

Haverá um problema com os sinais. A raiz de um poder uniforme é sempre positiva.

Em calculadora onde o grau é fracionário

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

Em mql onde o grau é fracionário

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

zero divide in 'Pow.mq5' 

Em mql onde o grau é inteiro.

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

-27.0

Conclusão, a função não conta corretamente os poderes fracionários, e retorna divisão zero.

 
Igor Makanu:

m = 2

n = 10

sem parênteses o sinal de menos pode ser interpretado de forma diferente, imho

Obrigado pela resposta, mas em geral se tomarmos uma solução aritmeticamente correta, parece que apenas números complexos podem ser usados para implementar tal solução... Em seu método proposto, é necessário dividir o grau para que o valor subjacente tenha sempre um grau positivo e a resposta será sempre positiva. Mas se você tomar sem este ajuste - chegamos apenas a números complexos, porque de acordo com o modelo algébrico geralmente aceito, tanto quanto sei (não sou matemático por educação) - a raiz de um número negativo será um número complexo.

 
Roman:

Em mql onde está o grau fracionário

Em mql onde o grau é fracionário

Em mql onde o grau é inteiro.

Conclusão, a função não conta corretamente os graus fracionários, e retorna divisão zero.

A função é correta. A matemática padrão simplesmente não funciona lá)

 
Corrija-me se eu entendi mal, talvez haja uma solução fora dos números complexos, afinal de contas ?
 
Andrey Azatskiy:

A função é correta. A matemática padrão simplesmente não cabe lá)

-0,2 não é zero para devolver um erro de divisão por zero.