【问题标题】:std::pow gives a wrong approximation for fractional exponentsstd::pow 给出了小数指数的错误近似值
【发布时间】:2009-10-16 20:50:04
【问题描述】:

这就是我的意思

 double x=1.1402
 double pow=1/3;
 std::pow(x,pow) -1;

结果为 0,但我预计为 0.4465

等式是(1 + x) ^3= 1.1402,找到x

【问题讨论】:

  • 调试提示:如果您只是检查传递给 pow() 的参数,很明显 pow() 没有任何问题。你会看到第二个参数的值是 0 而不是 1/3,这表明 pow() 运行正常,问题出在你的代码上。
  • 好吧我已经解决了..愚蠢的整数
  • 每个人都犯了这个错误。

标签: c++ c numerical-methods


【解决方案1】:

1/3 是 0。这是整数除法。

试试:

double pow = 1.0 / 3.0;

为:

#include <iostream>
#include <cmath>

int main(void)
{
 double x = 1.1402;
 double pow = 1.0/3.0;
 std::cout << std::pow(x, pow) - 1;

}

【讨论】:

  • 有时是最简单的答案,有时是最完整的答案。 StackOverflow 也在随机化答案的顺序,所以有时出现在最前面的都是赢家。抽奖的好运气。
  • 更多的是他已经接受了我的回答,后来又改成了那个。我没有任何怨恨,13 票就足够了,虽然当时我已经满员了,接受是我获得代表的唯一方法。不过没问题:)
【解决方案2】:

1/3 是作为整数运算完成的,因此您将 0 分配给 pow。试试pow(x, 1.0/3.0);

【讨论】:

    【解决方案3】:

    许多人说 1/3 = 0,但没有解释为什么会这样。

    C 和 C++ 将根据操作数的类型执行操作。由于两个操作数都是整数,因此它会执行整数除法来创建整数结果。当它被强制将该整数结果分配给一个双精度变量时,它会将整数 0 转换为双精度 0.0。

    没有必要将两个操作数都设为双精度,如果其中一个是双精度,编译器也会在执行操作之前将另一个操作数转换为双精度。 1.0/3 或 1/3.0 都将返回您预期的结果,1.0/3.0 也是如此。

    【讨论】:

      【解决方案4】:

      你的1/3是整数除法,整数除法的结果是0。

      【讨论】:

        猜你喜欢
        • 2014-01-12
        • 1970-01-01
        • 2022-06-19
        • 1970-01-01
        • 2023-01-30
        • 1970-01-01
        • 1970-01-01
        • 2013-01-19
        • 1970-01-01
        相关资源
        最近更新 更多