PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : KI?! - Funktion gibt scheinbar willkürlich Werte zurück



katinka
10-02-2004, 18:43
Hm? Bin gerade dabei mein erstes größeres Programm zu schreiben und beginne gerade an künstliche Intelligenz zu glauben. Nämlich dass mein Rechner mich ärgern will.

double funktion(int number, double *gp) {
double ret;
switch (number) {
case 0:
ret = -0.25*(1 - gp[1]);
break;
case 1:
ret = 0.25*(1 - gp[0]);
break;
case 2:
ret = 0.25*(1 + gp[1]);
break;
case 3:
ret = -0.25*(1 + gp[0]);
break;
}
return ret;
}

Wenn ich jetzt im übergeordneten Programm
double (*ff)(int, double *);
ff = funktion;

und später an verschiedenen Stellen

wert = (*ff)(i, gp);

aufrufe, stehen in wert in 90% der Fälle der richtig berechnete Wert. Für die Restlichen 10% kriege ich wert = nan. Die Argumente werden einwandfrei übergeben, die Schleifen richtig angesprochen. --> mittels ganz viel printf überprüft. Also zum Beispiel:

case 0:
printf("number=%d - gp1=%lf - ", number, gp[1]);
ret = -0.25*(1 - gp[1]);
printf("ergebnis=%lf\n", ret);
break;

Dann sieht meine Ausgabe beim Schleifendurchlauf im übergeordneten Programm so aus:

number=0 - gp1=2 - ergebnis=-0.2500
number=0 - gp1=2 - ergebnis=-0.2500
number=0 - gp1=2 - ergebnis=nan
number=0 - gp1=2 - ergebnis=-0.2500

Kann mir das irgendjemand erklären? Mein Latein ist gerade völlig am Ende!!!

pik7
10-02-2004, 21:06
hallo,

nan=="not a number"?

http://ursa.as.arizona.edu/~rad/phys205/basic_c/node6.html#foot273

mal lesen

katinka
10-02-2004, 21:59
Die Seite ist absolut empfehlenswert, enthält aber leider nix Neues. Das ist ja gerade mein Problem.

Ich rufe die Funktion auf, kriege einen richtigen Wert und freue mich das alles gut funktioniert. Dann rufe ich die gleiche Funktion nocheinmal mit absolut identischen Werten auf und plötzlich produziert sie kein Ergebnis mehr, sonder nan. Da wird aber nicht durch null geteilt sondern nur brav addiert, substrahiert und ein bißchen multipliziert.

Und da hilft die Aussage nan=not a number nicht weiter. Das steht auch in meinem Kernigham/Richie. Aber warum ich bei hundertprozentig identischen Funktionsaufrufen mal Ergebnisse kriege und mal nicht steht in keiner Literatur, die ich besitze!

Also muss ich mir irgendwoanders einen Bug eingefangen haben - nicht in der oben beschriebenen Funktion selber. Jede Form von Hinweis wo zu suchen ist, wär schon hilfreich.

wraith
10-02-2004, 22:44
Original geschrieben von katinka
Das steht auch in meinem Kernigham/Richie.
Dann sollte da auch drinstehen,daß der Formatspezifierer bei printf für double %f ist und nicht %lf (nicht das ich das für den Grund für den Fehler halte,zumal er nur sporadisch aufzutreten scheint).

Ein minimales komplettes Programm,daß den Fehler liefert könntest du nicht posten?