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

标签 c++ cmath

相反,此操作返回 -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/

相关文章:

c++ - cMath 和 sin 函数的问题

c++ - 相关模板类之间函数参数的自动转换

c++ - 我可以从对象外部调用 VFunc 吗?

c++ - 为什么编译器让我调用 pow 和 sqrt,即使我没有包含 cmath?

C++:表达式必须是可修改的左值

performance - c++,cin 有问题吗?

c++ - 与 FLOP 相比,cmath 中 exp 的复杂性/实际成本是多少?

c++ - 输出二叉搜索树中叶节点的数量

c++ - 删除动态创建的对象

c++ eclipse wrong错误解释