C++ 根高于2
我试图取一个表达式的第11个根,得到的结果是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) 尝试
-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);请注意,求根会降低精度,就像灾难性的相消一样,例如,在平方根之后,您的精度会减半,我不知道第十一个根会给您留下多少精度,但不会太多。