相反,此操作返回-1.IND,因为sqrt(-1)返回-1.IND.C++引用中提到的域错误是否该sqrt为负值返回不会保留这实际上是i的信息吗?
是否有某种方法可以对所有负数执行此操作,以便返回正确的值,即pow(sqrt(-36), 2)返回-36?
gsa*_*ras 13
您可以使用std :: complex来实现您的目标,如下所示:
#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;
}
Run Code Online (Sandbox Code Playgroud)
输出:
(-36,0)
Real part = -36
Run Code Online (Sandbox Code Playgroud)
请注意,此处使用std :: sqrt(std :: complex).
您遇到的行为背后的原因是sqrt的签名,即:
double sqrt(double x);
float sqrt(float x);
long double sqrt(long double x);
double sqrt(T x); //整数类型的附加重载
这意味着无论使用哪种原型,你都没有比nan(或+ -inf)更好的东西,因为返回类型不能支持虚部.这就是std::complex存在的原因.
因此,sqrt(-1)将被一个nan可能无法处理的可能性所取代pow(),因此-1因为指数而保持不变.结果,在呼叫之后信息已经丢失,sqrt()并且pow()对此无能为力.