0

我正在尝试取表达式的第 11 个根,我得到了-inf.

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

wherej只是一些log表达。我已经检查了那个号码以确保它是有效的,而且确实如此。我认为这是权力表达的运行方式。有一个更好的方法吗?谢谢。

是的,我已将其cmath纳入我的工作。

4

2 回答 2

1

如果您的输入有点理智,我想不出 pow 返回-inf 的正当理由。但是,如果您传递的是负数,可能值得尝试的是:

if(j==0) return 0;
if(j<0) return -pow(-j, 1.0/11.0);
return pow(j,1.0/11.0);
于 2013-10-29T07:26:04.483 回答
1
  1. 尝试查找 FPU 错误

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

    asm { fninit; };
    
    • 这会重置 FPU,因此如果您在堆栈上遇到问题,它将有所帮助
    • 但当然不要在一些 FPU 计算中间这样做
    • 它会破坏它的结果
    • 如果您不在 x87 平台上,那么这将无济于事
  3. 崩溃前的 j 值将是一个与我们分享的良好开端。

  4. 尝试将 pow 的结果存储到一些浮点/双精度变量

    • cout 该变量不是临时堆内存位置
    • 如果它打印 -inf 如果它也是 -inf
    • (cout not pow 可能有问题......)
  5. 最小化您的代码(部分关闭所有内容)

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

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

于 2013-10-29T07:57:20.100 回答