无效的操作数到二进制^(有'double'和'double')

时间:2012-10-03 05:26:17

标签: c operand

我对编码很新,并且已经构建了一个插入三次样条曲线的代码,但我仍然坚持最后一个等式执行以下错误:_“无效的操作数到二进制^(有'double'和'double “)|“

问题出现在代码的最后一位,两个第一行的“population =”。如果有人能指出我正确的方向,我将非常感激。

#include <stdio.h>


main () {

    int x;
    int y;
    double stats[10][2];
    double gpp[8][9] = {0};
    double gppr[10] = {0};
    double year;
    double population;
    int xi = 0;
    year=1950;
    population=0;
    x=0;

    stats[0][0] = 1930; stats[1][0] = 1940; stats[2][0] = 1949;
    stats[3][0] = 1955; stats[4][0] = 1960; stats[5][0] = 1970;
    stats[6][0] = 1980; stats[7][0] = 1990; stats[8][0] = 2000;
    stats[9][0] = 2005;

    stats[0][1] = 21.058; stats[1][1] = 23.547; stats[2][1] = 20.167;
    stats[3][1] = 21.502; stats[4][1] = 24.989; stats[5][1] = 30.852; 
    stats[6][1] = 37.407; stats[7][1] = 43.390; stats[8][1] = 45.985;
    stats[9][1] = 47.041;

    //Initiate  g'' system of equation
    for (x=0;x<8;x++) {
        gpp[x][x] = ((stats[x+1][0]-stats[x][0])+(stats[x+2][0]-stats[x+1][0]))/3;
        if (x<7) {
            gpp[x][x+1] = (stats[x+2][0]-stats[x+1][0])/6;
        }
        if (x>0) {
            gpp[x][x-1] = (stats[x+2][0]-stats[x+1][0])/6;
        }
        gpp[x][8] = ((stats[x+2][1]-stats[x+1][1])/(stats[x+2][0]-stats[x+1][0]))-((stats[x+1][1]-stats[x][1])/(stats[x+1][0]-stats[x][0]));
    }

    //Forward sweep
    for (x=0;x<7;x++) {
        gpp[x+1][x] = 0;
        gpp[x+1][x+1] = gpp[x+1][x+1] - (gpp[x][x+1]/gpp[x][x])*gpp[x+1][x];
        gpp[x+1][8] = gpp[x+1][8] - (gpp[x][x+1]/gpp[x][x])*gpp[x][8];
    }
    //Backward sweep
    gppr[9] = 0;gppr[0] = 0;
    gppr[8] = gpp[7][8]/gpp[7][7];
    for (x=7;x > 0;x=x-1) {
        gppr[x] = (gpp[x][8]-(gppr[x+1]*gpp[x][x+1]))/gpp[x][x];
    }

    //check where is xi
    for (x=0;x<10;x++) {
        if (stats[x][0] > year) {
            xi = x;
            break;
        }
    }

//Calculate population at x
population = (gppr[xi]/6)*((((stats[xi+1][0]-year)^3.0)/(stats[xi+1][0]-stats[xi][0]))-(stats[xi+1][0]-stats[xi][0])*((stats[xi+1][0]-year)))
       + (gppr[xi+1]/6)*((((year-stats[xi][0])^3.0)/(stats[xi+1][0]-stats[xi][0]))-(stats[xi+1][0]-stats[xi][0])*((year-stats[xi+1][0])))
       + (stats[xi][1])*((stats[xi+1][0]-year)/(stats[xi+1][0]-stats[xi][0]))
       + (stats[xi+1][1])*((year-stats[xi][0])/(stats[xi+1][0]-stats[xi][0]));

}

我期待更多地了解C!

雨果

3 个答案:

答案 0 :(得分:5)

^是C中的异或运算符,不适用于双精度数。它是一个按位运算符,您可以在其上找到更多详细信息(以及其他按位运算符)here

如果你想将一个数字提升到另一个数字,你需要pow()函数。

类似于:

((stats[xi+1][0]-year)^3.0)

实际应该写成:

pow (stats[xi+1][0] - year, 3.0)

最新(C11)标准的第7.12.7.4 The pow functions节规定:

  

<强>梗概:
  #include <math.h>
  double pow(double x, double y);
  float powf(float x, float y);
  long double powl(long double x, long double y);

     

说明
  pow函数计算x增加到幂y。如果x是有限的,则会发生域错误   和负和y是有限的而不是整数值。可能会出现范围错误。一个域名   如果x为零且y为零,则可能发生错误。如果x为,则可能发生域错误或极点错误   零和y小于零。

     

pow函数返回x y

答案 1 :(得分:3)

C没有指数运算符。 ^是XOR运算符,它不适用于非整数,因此出错。请改用pow功能。

答案 2 :(得分:0)

我认为在最后一个等式中你试图找到数学的幂函数。但在c“^”中,此运算符表示独占或。最好试试#include&gt; math.h&gt;