相反,此操作返回 -1.IND,因为 sqrt(-1)
返回 -1.IND。 C++ reference上提到的域名错误这个 sqrt 返回负值不保留这实际上是 i 的信息?
是否有某种方法可以对所有负数执行此操作,以便它返回正确的值,即 pow(sqrt(-36), 2)
将返回 -36?
最佳答案
您可以使用 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;
}
输出:
(-36,0)
Real part = -36
请注意 std::sqrt(std::complex)在这里使用。
您遇到的行为背后的原因是 sqrt 的签名,即:
double sqrt (double x);
float sqrt (float x);
long double sqrt (long double x);
double sqrt (T x); // additional overloads for integral types
这意味着无论使用哪个原型(prototype),您都不会得到比 nan
(或 +-inf)更好的东西,因为返回类型不能支持虚部。这就是 std::complex
存在的原因。
因此,sqrt(-1)
可能会被 nan
替换,pow()
无法处理,所以由于指数,-1 保持不变。因此,在调用 sqrt()
之后信息已经丢失,而 pow()
对此无能为力。
关于c++ - 为什么 pow(sqrt(-1), 2) 不返回 -1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30732742/