Sie können std::complex verwenden Ihr Ziel zu erreichen, wie folgt aus:
#include <complex>
#include <iostream>
int main() {
const std::complex<double> result =
std::pow(std::sqrt(std::complex<double>(-36,0)), 2);
std::cout << result << std::endl;
std::cout << "Real part = " << result.real() << std::endl;
}
Ausgang:
(-36,0)
Real part = -36
Beachten Sie, dass std::sqrt(std::complex) hier verwendet wird.
Der Grund für das Verhalten Sie ist die Unterschriften von sqrt begegnet, nämlich:
Doppel sqrt (double x);
float sqrt (float x);
lange doppelte sqrt (lange doppelte x);
Doppel-Quadrat (T x); // zusätzliche Überlastungen für integrale Typen
was bedeutet, dass unabhängig davon, welche Prototyp verwendet werden, Sie bekommen nichts besser als ein nan
(oder a + inf), da die Rückgabetypen können nicht den imaginären Teil unterstützen . Deshalb existiert std::complex
existiert.
Also, sqrt(-1)
wird wahrscheinlich durch eine nan
ersetzt werden, die nicht von pow()
behandelt werden kann, so dass -1 wegen des Exponenten intakt bleibt. Als Ergebnis sind die Informationen bereits verloren, nachdem der Anruf an sqrt()
und pow()
nichts dagegen tun kann.
Per Definition ist eine gerade Potenz einer reellen Zahl positiv. – bereal
Was Sie brauchen, ist eine komplexe Zahlenbibliothek. – Mysticial
Wenn überhaupt, sollte es 0 auslassen oder zurückgeben (weil der reelle Teil 0 ist und 0^2 0 ist). –