Frage

Ich bin ziemlich neu im Codieren und habe einen Code zum Interpolieren eines kubischen Splines erstellt, aber ich stecke bei der letzten Gleichung fest und mache den folgenden Fehler:_"ungültige Operanden zu binär ^ (haben 'double' und 'double') |"

Das Problem liegt im letzten Bit des Codes mit "population =" für die beiden ersten Zeilen.Ich würde es wirklich begrüßen, wenn mir jemand die richtige Richtung weisen könnte.

#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]));

}

Ich freue mich darauf, ein bisschen mehr über C zu lernen!

Hugo

War es hilfreich?

Lösung

^ ist der Exklusiv-ODER-Operator in C und ist für Doppel nicht geeignet.Es ist ein bitweiser Operator und Sie können weitere Details dazu finden (und die anderen bitweisen Operatoren) hier.

Wenn Sie eine Zahl zur Potenz einer anderen erhöhen möchten, benötigen Sie die pow() Funktion.

Also so etwas wie:

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

sollte eigentlich geschrieben werden:

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

Abschnitt 7.12.7.4 The pow functions der neuesten (C11) Normzustände:

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);

Beschreibung:
Die pow-Funktionen berechnen x hoch y.Ein Domänenfehler tritt auf, wenn x endlich ist und negativ und y ist endlich und kein ganzzahliger Wert.Ein Bereichsfehler kann auftreten.Domain ein Fehler kann auftreten, wenn x Null und y Null ist.Ein Domänen- oder Polfehler kann auftreten, wenn x ist null und y ist kleiner als Null.

Die pow-Funktionen geben x zurücky.

Andere Tipps

C hat keinen Exponentenoperator. ^ ist der XOR-Operator, der bei Nicht-Ganzzahlen nicht funktioniert, daher der Fehler.Verwenden Sie die pow funktion stattdessen.

Ich denke in der letzten Gleichung, die Sie versuchen, die Machtfunktion der Mathematik zu finden.In C "^" bedeutet dieser Bediener jedoch exklusiv oder.Besser versuchen #include> math.h>

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top