我对编码很新,并且已经构建了一个插入三次样条曲线的代码,但我仍然坚持最后一个等式执行以下错误:_“无效的操作数到二进制^(有'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!
雨果
答案 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;