C++ 为什么';t功率(sqrt(-1),2)返回-1?
相反,此操作返回-1.IND,因为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)
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)