【问题标题】:Why am I not getting correct result when I calculate exponent with ^ in C++?为什么我在 C++ 中用 ^ 计算指数时没有得到正确的结果?
【发布时间】:2010-04-23 03:42:51
【问题描述】:

我正在使用 Bode 公式计算第 n 颗行星到太阳的距离

dist = (4 + 3*(2^(n-2)))/10

如果我以这种方式计算距离,我会得到正确的值:

dist[2] = ((4 + 3*1)/10.0) ;  
dist[3] = ((4 + 3*2)/10.0) ;  
dist[4] = ((4 + 3*4)/10.0) ;

但是这样做会得到不正确的值:

vector <double> dist(5);  

for (unsigned int i = 2; i < 5; i++)  
{  
    dist[i] = ((4 + 3*(2^(3-2)))/10.0) ;  
}

为什么会这样?

【问题讨论】:

    标签: c++


    【解决方案1】:

    ^ 字符表示按位异或,而不是您期望的指数函数。

    由于您已经在循环中计算它,因此您可以轻松地生成方程式中所需的 2 的幂,一些简单的(并且接近您的代码)将是:

    vector<double> dist(5);
    unsigned int j = 1;
    for(unsigned int i = 2; i < 5; i++){
        dist[i] = (4+3*j)/10.0;
        j = j * 2;
    }
    

    在这个特定实例中,我们将j 初始化为您需要的n-2 的第一个值,然后继续将它乘以2 以获得您需要的2 的下一个幂。

    【讨论】:

      【解决方案2】:

      因为^ 不是 C++ 中的幂运算符。您可以使用std::pow,但可以使用double,或者您可以进行大量转换以使其与int 一起使用。

      【讨论】:

        【解决方案3】:

        首先:

        dist[i] = ((4 + 3*(2^(3-2)))/10.0) ;
        

        是恒定的。我相信您打算执行以下操作:

        dist[i] = ((4 + 3*(pow(2, (i-2)))/10.0) ;
        

        【讨论】:

          【解决方案4】:

          首先,^ 表示“xor”,而不是“power of”。另一方面,您正在计算一个常数值(您使用的是3-2 而不是i-2)。但是,由于您需要 2 的幂,因此位移可以按您的方式工作。 ("1

          vector <double> dist(5);
          
          for (unsigned int i = 2; i < 5; i++) {
             dist[i] = ((4 + 3*(1 << (i - 2)))/10.0) ;
          }
          

          对于其他基础,您需要在 &lt;math.h&gt;/&lt;cmath&gt;(分别为 C/C++)中找到的 pow() 库函数。

          【讨论】:

          • "对于其他基础,您需要 pow()" ...这根本不是真的。
          • 好吧,假设您没有通过迭代自己完成求幂,是的。我的监督。
          【解决方案5】:

          ^ 运算符在 C++(和其他几种语言)中的意思是“异或”,不是“提升权力”。

          C++ 没有“提升权力”运算符;你需要使用2参数函数pow(你可以#include旧的C代&lt;math.h&gt;,或者#include &lt;cmath&gt;并使用std::pow),它返回一个double;或者,正如其他答案所建议的那样,对于这种特殊情况,您可能会使用位移。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-11-04
            • 2013-08-19
            • 2017-10-30
            • 1970-01-01
            相关资源
            最近更新 更多