I'm rather new to coding and have been building a code to interpolate a cubic spline, but I am stuck on the last equation do the following error: _"invalid operands to binary ^ (have 'double' and 'double')|"
The problem is in the last bit of the code with "population =" for the two first lines. I would really appreciate it if someone could point me in the right direction.
#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]));
}
I look forward to learning a little more about C!
Hugo
^
is the exclusive-OR operator in C and is unsuitable for doubles. It's a bitwise operator and you can find more details on it (and the other bitwise operators) here.
If you want to raise one number to the power of another, you need the pow()
function.
So something like:
((stats[xi+1][0]-year)^3.0)
should actually be written:
pow (stats[xi+1][0] - year, 3.0)
Section 7.12.7.4 The pow functions
of the latest (C11) standard states:
Synopsis:
#include <math.h>
double pow(double x, double y);
float powf(float x, float y);
long double powl(long double x, long double y);
Description:
The pow functions compute x raised to the power y. A domain error occurs if x is finite and negative and y is finite and not an integer value. A range error may occur. A domain error may occur if x is zero and y is zero. A domain error or pole error may occur if x is zero and y is less than zero.The pow functions return xy.