Wie verhindert man einen Überlauf bei Verwendung der üblichen mathematischen Funktionen exp () log ()?

7

Alles steht im Titel. Wie überprüfe ich einen möglichen Überlauf bei Verwendung der beiden Funktionen exp () und log ()?

    
WildThing 11.07.2013, 10:18
quelle

5 Antworten

7

Um die Antwort von @TheOtherGuy zu erweitern, können Sie den Vorgang abbrechen, wenn ein Überlauf auftritt.

%Vor%     
Keine Lust 11.07.2013, 10:33
quelle
12
%Vor%

Wenn ein Oferflow auftritt, wird errno auf ERANGE gesetzt.


Nächstes Mal, machen Sie Ihre Hausaufgaben, bevor Sie fragen.

Googeln: "c ++ exp" gab das als erstes Ergebnis Ссылка zurück
In der Mitte der Seite gibt es GENAU, was Sie suchen.

    
gifnoc-gkp 11.07.2013 10:21
quelle
2

Für die Behandlung mit exp ():

Vergleichen Sie einfach mit einer Variablen, die Sie dem Protokoll (FLT_MAX) zuweisen. FLT_MAX ist der größte Float. Sie können dies vor tun, indem Sie ein exp () berechnen. Weil log () die Umkehrung von exp () ist.

%Vor%

Für die Handhabung von log ():

1) Sie können log (x) vor dem Überlauf von x nicht ablaufen lassen. (für die obere Grenze)

2) Die Genauigkeit von Float's / Double's (x) reicht nicht aus, um für log (x) in Negativ-Unendlich zu fließen.

3) Stellen Sie sicher, dass x größer als Null ist.

    
quelle
1

Der beste Weg, um im Vorfeld auf Überlauf zu prüfen, ist es, dies von Fall zu Fall intelligent zu tun.

Mit Ihrem Wissen über Logarithmen und Exponenten sollten Sie in der Lage sein, potentielle Überläufe mithilfe von Eigenschaften wie INT_MAX zu erkennen: Sehen Sie sich diese C ++ an Einschränkungen

Ich habe eine grobe Beispiel-C ++ - Ausführung zusammengestellt, vorausgesetzt, Sie wissen vorher, welche Grenzen Sie verfolgen.

%Vor%

Wenn Sie versuchen, die Fehler post mortem zu erkennen, überprüfen Sie errno in range .

    
jdero 11.07.2013 10:25
quelle
1

Besser als verhindern, können Sie die Ausnahme abfangen:

%Vor%     
LS_ᴅᴇᴠ 11.07.2013 10:52
quelle

Tags und Links