Warum gibt es solche Tricks mit Abschlüssen?

 

Ich muss eine Funktion schreiben, die mit Potenzen arbeitet, und dabei habe ich etwas Interessantes entdeckt:

Wenn ich eine negative Bruchzahl durch eine negative Bruchpotenz ersetze, schreibt MQL5 -nan.

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

Ich habe es in C++ überprüft und das gleiche Ergebnis erhalten (ich weiß nicht, welche Version der Sprache verwendet wurde, weil ich zu faul war, um zu kompilieren und ich habe es nur mit cpp.sh getestet).

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

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


Ich denke, es gibt keinen Fehler in MQL5, wenn die Antwort die gleiche in Plus ist! Aber die Frage ist, warum das so ist? Wenn wir nachrechnen, sollte die Antwort auf der Hand liegen. Mathematisch gesehen ist eine negative Zahl gleich eins geteilt durch die gleiche Zahl in positiver Potenz. Mit anderen Worten:

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

Und der Taschenrechner auf dem Computer bestätigt das. Was ist also der Trick mit den Noten?

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

Ich muss eine Funktion schreiben, die mit Potenzen arbeitet, und dabei habe ich etwas Interessantes entdeckt:

Wenn ich eine negative Bruchzahl durch eine negative Bruchpotenz ersetze, schreibt MQL5 -nan.

Ich habe es in C++ überprüft und das gleiche Ergebnis erhalten (ich weiß nicht, welche Version der Sprache verwendet wurde, weil ich zu faul war, um zu kompilieren und ich habe es nur mit cpp.sh getestet).


Die Pluszeichen geben die gleiche Antwort, es gibt keinen Fehler in MQL5! Aber was ist der Grund für eine solche Antwort? Wenn wir Mathematik verwenden, sollte die Antwort gegeben werden. Mathematisch gesehen ist eine Zahl in negativer Potenz gleich eins geteilt durch die gleiche Zahl in positiver Potenz. Mit anderen Worten:

Und der Taschenrechner auf dem Computer bestätigt das. Was hat es also mit den Abschlüssen auf sich?

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

Vielleicht wachsen die Beine aus der Tatsache, dass man aus einer negativen Zahl keine gerade Wurzel ziehen kann? Ich bin schon etwas verwirrt... Und vor allem, wie kann man sie umgehen?

 
Andrey Azatskiy:

Und vor allem, wie kann man sie umgehen?

m = 2

n = 10

double result = pow(pow(-5.5,2.0),-0.1); 
Print("result = ",result);                      //result = 0.7110947333604484
ohne Klammern kann das Minuszeichen anders interpretiert werden, imho
 
Roman:

Es wird ein Problem mit den Schildern geben. Die Wurzel aus einer geraden Potenz ist immer positiv

 
Andrey Azatskiy:

Es wird ein Problem mit den Schildern geben. Die Wurzel aus einer geraden Potenz ist immer positiv.

Bei Rechnern mit gebrochenem Grad

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

In mql, wo der Grad gebrochen ist

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

zero divide in 'Pow.mq5' 

In mql, wo der Grad ganzzahlig ist.

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

-27.0

Fazit: Die Funktion zählt die Nachkommastellen nicht korrekt und gibt Null-Division zurück.

 
Igor Makanu:

m = 2

n = 10

ohne Klammern kann das Minuszeichen anders interpretiert werden, imho

Vielen Dank für die Antwort, aber im Allgemeinen scheint es, wenn wir eine arithmetisch korrekte Lösung annehmen, dass nur komplexe Zahlen verwendet werden können, um eine solche Lösung zu implementieren... Bei der von Ihnen vorgeschlagenen Methode muss der Grad geteilt werden, damit der zugrunde liegende Wert immer einen positiven Grad hat und die Antwort immer positiv ist. Aber wenn man diese Anpassung weglässt, kommen wir nur zu den komplexen Zahlen, denn nach dem allgemein anerkannten algebraischen Modell, soweit ich weiß (ich bin kein studierter Mathematiker), ist die Wurzel einer negativen Zahl eine komplexe Zahl.

 
Roman:

In mql, wo ist der fraktionale Grad

In mql, wo der Grad gebrochen ist

In mql, wo der Grad ganzzahlig ist.

Fazit: Die Funktion zählt die Nachkommastellen nicht korrekt und gibt Null-Divide zurück.

Die Funktion ist korrekt. Die Standard-Mathematik funktioniert dort einfach nicht)

 
Korrigieren Sie mich, wenn ich das falsch verstanden habe, vielleicht gibt es ja doch eine Lösung außerhalb der komplexen Zahlen?
 
Andrey Azatskiy:

Die Funktion ist korrekt. Die Standard-Mathematik passt da einfach nicht)

-0,2 ist nicht Null und führt zu einem Fehler bei der Division durch Null.