Perché ci sono questi trucchi con le lauree?

 

Ho bisogno di scrivere una funzione che funzioni con le potenze e nel processo ho scoperto qualcosa di interessante:

Se sostituisco un numero frazionario negativo a un grado frazionario negativo, MQL5 scrive -nan.

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

L'ho controllato in C++ e ho ottenuto lo stesso risultato (non so quale versione del linguaggio sia stata usata, perché ero troppo pigro per compilare e l'ho solo testato con cpp.sh).

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

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


Penso che non ci sia nessun errore in MQL5 se la risposta è la stessa in più! Ma la domanda è: perché succede così? Se facciamo i conti, la risposta dovrebbe essere lì. Matematicamente, un numero negativo è uguale a uno diviso per lo stesso numero alla potenza positiva. In altre parole:

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

E la calcolatrice del computer lo conferma. Cos'è questo trucco dei voti?

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

Ho bisogno di scrivere una funzione che funzioni con le potenze e nel processo ho scoperto qualcosa di interessante:

Se sostituisco un numero frazionario negativo a una potenza frazionaria negativa, MQL5 scrive -nan.

L'ho controllato in C++ e ho ottenuto lo stesso risultato (non so quale versione del linguaggio sia stata usata, perché ero troppo pigro per compilare e l'ho solo testato con cpp.sh).


I plus danno la stessa risposta, non c'è nessun errore in MQL5! Ma qual è la ragione di una tale risposta? Se usiamo la matematica, la risposta dovrebbe essere data. Matematicamente, un numero alla potenza negativa è uguale a uno diviso per lo stesso numero alla potenza positiva. In altre parole:

E la calcolatrice del computer lo conferma. Cos'è questa storia dei gradi?

In R:

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

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

 
Aleksey Nikolayev:

in R:

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

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

Forse le gambe crescono dal fatto che non si può prendere una radice pari da un numero negativo? Sono già un po' confuso... E soprattutto come aggirarlo?

 
Andrey Azatskiy:

E soprattutto come aggirarlo?

m = 2

n = 10

double result = pow(pow(-5.5,2.0),-0.1); 
Print("result = ",result);                      //result = 0.7110947333604484
senza parentesi, il segno meno può essere interpretato diversamente, imho
 
Roman:

Ci sarà un problema con i cartelli. La radice di una potenza pari è sempre positiva

 
Andrey Azatskiy:

Ci sarà un problema con i cartelli. La radice di una potenza pari è sempre positiva.

Nel calcolatore in cui il grado è frazionario

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

In mql dove il grado è frazionario

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

zero divide in 'Pow.mq5' 

In mql dove il grado è intero.

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

-27.0

Conclusione, la funzione non conta correttamente le potenze frazionarie e restituisce zero divide.

 
Igor Makanu:

m = 2

n = 10

senza parentesi il segno meno può essere interpretato diversamente, imho

Grazie per la risposta, ma in generale se prendiamo una soluzione aritmeticamente corretta, sembra che solo i numeri complessi possano essere usati per implementare tale soluzione... Nel metodo da voi proposto è necessario dividere il grado in modo che il valore sottostante abbia sempre un grado positivo e la risposta sarà sempre positiva. Ma se si prende senza questo adattamento - si arriva solo ai numeri complessi, perché secondo il modello algebrico generalmente accettato per quanto ne so (non sono un matematico di formazione) - la radice di un numero negativo sarà un numero complesso.

 
Roman:

In mql dove è il grado frazionario

In mql dove il grado è frazionario

In mql dove il grado è intero.

Conclusione, la funzione non conta correttamente i gradi frazionari, e restituisce zero divide.

La funzione è corretta. La matematica standard non funziona lì)

 
Correggetemi se ho capito male, forse c'è una soluzione al di fuori dei numeri complessi dopo tutto?
 
Andrey Azatskiy:

La funzione è corretta. La matematica standard semplicemente non ci sta)

-0,2 non è zero per restituire un errore di divisione per zero.

Motivazione: