Warum gibt pow (sqrt (-1), 2) -1 zurück?

8

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?

zurück     
Ren 09.06.2015, 12:59
quelle

5 Antworten

12

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.

    
gsamaras 09.06.2015, 13:10
quelle
6

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 .

    
dan04 09.06.2015 13:07
quelle
4

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.

    
Some programmer dude 09.06.2015 13:07
quelle
3

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.

    
RedX 09.06.2015 13:07
quelle
0

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 .

    
emsr 09.06.2015 16:52
quelle

Tags und Links