为什么pow(sqrt(-1),2)不返回-1?

Ren*_*Ren 9 c++ cmath

相反,此操作返回-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()对此无能为力.


dan*_*n04 6

因为您正在调用该函数double sqrt(double),并且double返回值只能存储实数,无穷大(带符号)或NaN.没有为不表示.

如果要存储复数,请使用std :: complex.