C++ 为什么';t功率(sqrt(-1),2)返回-1?

C++ 为什么';t功率(sqrt(-1),2)返回-1?,c++,cmath,C++,Cmath,相反,此操作返回-1.IND,因为sqrt(-1)返回-1.IND。上提到的这个sqrt为负值返回的域错误是否没有保留这实际上是i的信息 是否有某种方法可以对所有负数执行此操作,以便它返回正确的值,即pow(sqrt(-36),2)将返回-36?以返回域错误的实现定义错误。在这种情况下,(arg:=-1)

相反,此操作返回-1.IND,因为
sqrt(-1)
返回-1.IND。上提到的这个sqrt为负值返回的域错误是否没有保留这实际上是i的信息

是否有某种方法可以对所有负数执行此操作,以便它返回正确的值,即
pow(sqrt(-36),2)
将返回-36?

以返回域错误的实现定义错误。在这种情况下,
(arg:=-1)<-0
是域错误

在域错误上返回实现定义的错误

因此,接收
-1.Ind
是一个合理的解决方案


正如Mystical指出的,您需要一个复数库。

因为您正在调用函数
double sqrt(double)
,而
double
返回值只能存储实数、无穷大(带符号)或NaN。我没有代表权

如果要存储复数,请使用。

From:

如果参数小于-0,则引发FE_INVALID并返回NaN

然后从

。。。如果任何参数为NaN,则返回NaN

因此,你不能简单地用
pow(sqrt(x),y)
来表示任何实际的
x
为负值。

你可以用它来实现你的目标,比如:

#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;
}
请注意,这里使用的是


您遇到的行为背后的原因是以下签名:

双sqrt(双x)

浮动sqrt(浮动x)

长双sqrt(长双x)

双sqrt(T x);//整数类型的附加重载

这意味着,无论使用哪个原型,您都只能得到一个
nan
(或+-inf),因为返回类型不能支持虚部。这就是
std::complex
存在的原因


因此,
sqrt(-1)
将被一个
nan
替换,它可能不能被
pow()
处理,因此由于指数的原因,-1保持不变。因此,在调用
sqrt()
pow()

我知道最近的情况,并支持这一点。看起来也一样


这实际上是一个后C++14添加,但它仍然在
std
命名空间中,而不是
实验性的

根据定义,实数的偶数幂是正的。您需要的是一个复数库。如果有什么,它应该除了或返回0(因为实数部分是0,0^2是0)
sqrt
的签名为
double sqrt(double x)
i
不是一个
double
。解释得也很好,不知道为什么它有0个投票。我会改变的!我认为CPPPreference有更好的描述。
(-36,0)
Real part = -36
<complex>
#include <iostream>

int
main()
{
  using namespace std::literals::complex_literals;
  auto z = std::pow(std::sqrt(-36.0 + 0.0i), 2.0);
  std::cout << z << '\n';
}
ed@bad-horse:~$ ./cpow 
(-36,4.40873e-15)