C++ 根高于2

C++ 根高于2,c++,square-root,cmath,C++,Square Root,Cmath,我试图取一个表达式的第11个根,得到的结果是-inf std::cout << pow(j,(1.0/11.0)) << std::endl; std::cout如果您的输入稍微正常,我想不出pow返回-inf的有效原因。但是,如果您输入的是负数,那么值得一试的是: if(j==0) return 0; if(j<0) return -pow(-j, 1.0/11.0); return pow(j,1.0/11.0); if(j==0)返回0; if(j) 尝试

我试图取一个表达式的第11个根,得到的结果是
-inf

std::cout << pow(j,(1.0/11.0)) << std::endl;

std::cout如果您的输入稍微正常,我想不出pow返回-inf的有效原因。但是,如果您输入的是负数,那么值得一试的是:

if(j==0) return 0;
if(j<0) return -pow(-j, 1.0/11.0);
return pow(j,1.0/11.0);
if(j==0)返回0;
if(j)
  • 尝试查找FPU错误

    • 最常见的是在某些函数中忘记返回float/double
    • 这导致FPU堆栈出现问题,而FPU堆栈非常小
  • 你也可以尝试在pow之前添加这个

    asm { fninit; };
    
    • 这将重置FPU,因此,如果堆栈出现问题,它将有所帮助
    • 但当然,在某些FPU计算过程中不要这样做
    • 这将破坏其结果
    • 如果您不在x87平台上,这将没有帮助
  • 崩溃前的j值将是与我们分享的一个良好开端

  • 尝试将pow的结果存储到某个浮点/双变量

    • 该变量不是临时堆内存位置吗
    • 如果它打印了-inf,那么也可以查看该变量的内部,如果它也是-inf
    • (可能是cout not pow有问题…)
  • 最小化代码(一部分一部分地关闭所有内容)

    • 看看问题是否突然不存在了
    • 隐藏内存泄漏和代码覆盖是邪恶的

  • 让我们知道您发现了什么。

    完整的可编译源代码可能会有所帮助。还可以使用输入值?ps:您也可以使用exp():double\u 11\u root=exp(log(j)/11.0);请注意,求根会降低精度,就像灾难性的相消一样,例如,在平方根之后,您的精度会减半,我不知道第十一个根会给您留下多少精度,但不会太多。