3 Stimmen

Rekursive harmonische Funktion gibt NaN zurück

Ich habe den folgenden Beispielcode geschrieben, um den harmonischen Wert von N. (1+1/2+1/3+...1/N) zu finden. Lesen Sie die Kommentare im Code in FETT geschrieben und helfen Sie mir, herauszufinden, warum dies geschieht.

#include <stdio.h>

float harmonic(float n, float har) {

    if(n==0) {
        return 0;
    }

    if(n==1) {
        printf("%f\n", har+1.0f);***/* This prints value 1.5000*/***
        return har+1.0f;
    }else{
        harmonic(n-1, (har+(1/n)));
    } 
} 

int main() 
{ 
    printf("%f\n", harmonic(2, 0.0f)); **/* But this prints value nan(Not a  Number)*/**  
    return 0; 
}

Danke! Naga

10voto

Matthew Flaschen Punkte 266507

Ich glaube, das wollen Sie tun:

return harmonic(n-1, (har+(1/n)));

2voto

redcayuga Punkte 1241

Mein erster Gedanke war, dass man Fließkommazahlen fast nie mit einfacher Gleichheit vergleichen sollte, also sollte "if(n==0)" "if(n<=EPSILON)" und "if(n==1)" "if(n<= 1.0f + EPSILON)" sein, wobei EPSILON ein kleiner positiver Bruch ist, vielleicht 1.0e-5. Das hängt davon ab, auf wie viel Präzision Sie sich verlassen können.

Aber dann wurde mir klar, dass n ein int sein sollte. Cast es zu einem Float vor der Division. Da die Vergleiche mit "n" stehen, riskieren Sie eine unendliche Rekursion.

Erwägen Sie die Verwendung eines Double anstelle eines Float.

Die Antwort von Matthew Flaschen geht auf den wahren Grund für die NaN-Meldung ein. Der ursprüngliche Code gibt nichts vom "else" zurück, so dass der Aufrufer wahrscheinlich Müll vom Stack liest. Daher das NaN.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X