Ursache eines Stapelüberlaufs bei dieser Methode (Fließkomma-Mathematik)

8

Ich erhalte gelegentlich eine stackoverflow-Ausnahme in dieser Methode.

%Vor%

Irgendwelche Vorschläge, warum ich es bekommen könnte? Irgendwelche Schritte, die ich unternehmen kann, um den Fehler zu beheben?

    
Rajeshwar 09.08.2013, 20:14
quelle

3 Antworten

15

Wahrscheinlich ist diese Methode nur der Tropfen, der das Fass zum Überlaufen bringt. Diese Funktion wird sich höchstens einmal selbst aufrufen, also ist es nicht das Problem. (Bearbeiten: Oder es ist das NAN-Problem, auf das andere verweisen, wobei zu einer unendlichen Rekursion führt.)

Sie können die Funktion einfach nicht rekursiv machen, was eine einfachere Option ist.

%Vor%     
Timothy Shields 09.08.2013, 20:21
quelle
24

Ihr Problem ist, wenn x keine Zahl ist. NAN >= 0.0 ist falsch, -NAN >= 0.0 ist ebenfalls falsch.

Sie könnten speziell gegen NAN überprüfen, wie andere vorgeschlagen haben, aber ich würde vorschlagen, Dinge zu vereinfachen:

%Vor%

Dies hat den Vorteil, dass Compiler intelligentere Annahmen über sein Verhalten treffen können. Beachten Sie, dass ich die Funktion "intern" als statisch markiert habe (was den Umfang auf die aktuelle Kompilierungseinheit beschränkt). Sie können auch unbenannte Namespaces verwenden. (Bearbeiten Sie: Timothy Shields hat eine einfachere Möglichkeit, die Rekursion zu entfernen, die alles in einer Funktion hält)

    
Dave 09.08.2013 20:20
quelle
8

Wenn x NaN ist, wird die Rekursion niemals beendet. Fügen Sie einen Scheck hinzu: Entweder std::isnan in C ++ 11 oder die faule x != x oder Document-and-blame-user. Wenn Sie sich entscheiden, NaN zu behandeln, könnte es eine vernünftige Wahl sein, sie zu propagieren.

    
Kerrek SB 09.08.2013 20:18
quelle

Tags und Links