Stattdessen gibt diese Operation -1.IND zurück, da sqrt(-1)
-1.IND zurückgibt. Wird der Domänenfehler in der C ++ - Referenz erwähnt, dass dieser sqrt für negative Werte zurückgibt, wird die Information, dass dies der Fall ist, nicht beibehalten eigentlich ich ?
Gibt es eine Möglichkeit, diese Operation für alle negativen Zahlen durchzuführen, sodass sie den richtigen Wert zurückgibt, d. h. pow(sqrt(-36), 2)
gibt -36?
Sie können std :: complex verwenden, um Ihr Ziel zu erreichen:
%Vor%Ausgabe:
%Vor%Beachten Sie, dass hier std :: sqrt (std :: complex) verwendet wird.
Der Grund für das Verhalten, dem Sie begegnet sind, sind die Signaturen von sqrt , und zwar:
doppeltes Quadrat (doppeltes x);
float sqrt (float x);
long double sqrt (long double x);
Doppel-Quadrat (T x); // zusätzliche Überladungen für ganzzahlige Typen
was bedeutet, dass egal welcher Prototyp verwendet wird, Sie nichts besseres erhalten als nan
(oder a + -inf), da die Rückgabetypen den Imaginärteil nicht unterstützen können. Deshalb existiert std::complex
.
Also wird sqrt(-1)
wahrscheinlich durch nan
ersetzt, was nicht mit pow()
behandelt werden kann, so dass -1 wegen des Exponenten intakt bleibt. Als Folge sind die Informationen bereits verloren, nachdem der Aufruf von sqrt()
und pow()
nichts dagegen tun kann.
Weil Sie die Funktion double sqrt(double)
aufrufen und der Rückgabewert double
nur reelle Zahlen, unendlich (mit Vorzeichen) oder NaN speichern kann. Es gibt keine Repräsentation für ich .
Wenn Sie komplexe Zahlen speichern möchten, verwenden Sie std :: complex .
Von diese sqrt
Referenzseite :
Wenn das Argument kleiner als -0 ist, wird FE_INVALID ausgelöst und NaN wird zurückgegeben.
Und dann von dieser pow
Referenzseite
... wenn ein Argument NaN ist, wird NaN zurückgegeben
Sie können also pow(sqrt(x), y)
nicht für eine echte x
verwenden, die negativ ist.
std::sqrt
ist definiert , um einen von der Implementierung definierten Fehler bei einem Domänenfehler zurückzugeben. In diesem Fall ist (arg := -1) < -0
ein Domänenfehler.
std::pow
ist ebenfalls definiert , um einen von der Implementierung definierten Fehler bei einem Domänenfehler zurückzugeben.
Also ist -1.Ind
eine plausible Lösung.
Wie Mystical darauf hingewiesen hat, benötigen Sie eine komplexe Zahlenbibliothek.
Wenn Sie C ++ 14 verwenden können, können Sie Literaloperatoren für komplexe verwenden: # include
%Vor%Wenn ich das ausführe, bekomme ich:
%Vor%Ich kenne die letzten gcc und clang unterstützen dies. Es sieht wie VS2015 auch aus.
Dies ist eigentlich ein Post-C ++ 14-Zusatz, aber immer noch in einem std
-Namespace und nicht in experimental
.