È possibile utilizzare std::complex per raggiungere il tuo obiettivo, in questo modo:
#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;
}
uscita:
(-36,0)
Real part = -36
noti che std::sqrt(std::complex) viene utilizzato qui.
Il motivo dietro il comportamento che si incontra è la firma di sqrt, vale a dire:
doppia sqrt (double x);
float sqrt (float x);
long double sqrt (long double x);
doppio sqrt (T x); // sovraccarichi aggiuntivi per tipi integrali
il che significa che non importa quale prototipo verrà utilizzato, si stanno ottenendo niente di meglio che un nan
(o un + -inf), dal momento che i tipi restituiti non può sostenere la parte immaginaria . Ecco perché esiste std::complex
.
Quindi, sqrt(-1)
sarà sostituito da un nan
probabilmente, che non può essere trattato da pow()
, in modo che -1 resti intatto, a causa dell'esponente. Di conseguenza, le informazioni sono già perse dopo che la chiamata a sqrt()
e pow()
non può fare nulla al riguardo.
Per definizione, la potenza uniforme di un numero reale è positiva. – bereal
Quello che ti serve è una libreria di numeri complessi. – Mysticial
Se qualcosa, dovrebbe eccetto o restituire 0, (perché la parte reale è 0 e 0^2 è 0). –