2

我对编码很陌生,并且一直在构建一个插入三次样条的代码,但我被困在最后一个等式上执行以下错误:_“二进制^的无效操​​作数(有'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!

雨果

4

3 回答 3

6

^是 C 中的异或运算符,不适合双精度数。它是一个位运算符,您可以在此处找到有关它(以及其他位运算符)的更多详细信息。

如果你想将一个数字提升到另一个数字的幂,你需要这个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

于 2012-10-03T05:28:20.287 回答
3

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

于 2012-10-03T05:27:59.017 回答
0

我认为在最后一个等式中,您试图找到数学的幂函数。但在 c "^" 中,此运算符表示异或。最好尝试#include>math.h>

于 2012-10-03T05:32:36.940 回答