Datenformat
-
hallo zusammen!
Kann mir jemand sagen wie ich ein herauslaufen aus einem Datenformat innerhalb
einer Gleichung verhindern kann?also angenommen: y=x²+x+c;
alle Variablen vom Typ int oder float;die Werte für x und c werden vom Benutzer entgegengenommen und sind garantiert
innerhalb des Bereichs. Wie aber kann ich dafür sorgen das beim durchführen der
Gleichung kein int-Überlauf oder ein floating-point-overflow stattfinden kann?
-
Vielleicht nochmal etwas genauer.
Ich habe eine Klasse Term die einen Funktionsterm n-ten Grades aufnehmen kann.
mit GetY(x) wird dann das dazugehörige y berechnet. Für x und die Koeffizienten werden jeweils int- oder float-Werte erwartet, bin mir da noch net ganz sicher.
Der Rückgabewert von GetY(x) ist dann ebenfalls int oder float. Liegt es jetzt an mir innerhalb der Funktion bei der Berechnung einen Bereichsüberlauf zu verhindern oder muss der Benutzer der Klasse dafür sorgen dass er nur Werte übergibt die dann insgesamt bei der Berechnung nicht zu einem Überlauf führen.
Und wenn es an mir liegt, gibt es da einen Weg einen Überlauf festzustellen?
Bzw. wie kann ich ihn bei einem Gleitkommawert komplett verhindern, da er ja sofort
zum Programmabbruch führen würde?
-
Versuche es mal mit try und catch.
try { // Berechnungen ausführen } catch (...) // Fehler abfangen, "..." steht für alle Fehler { // das wird nur ausgeführt, wenn ein Fehler aufgetreten ist }Näheres findest du in der Hilfe.
-
try/catch hilft dir hier nichts. Letztendlich musst du vorher prüfen, ob ein Überlauf stattfinden wird. Wenn die Berechnung bereits durchgeführt wurde, ist es im Grunde schon zu spät. Teilweise ist das Verhalten dann auch undefiniert, zB bei signed Integers. Letztendlich hast du mehrere Möglichkeiten, dieses Problem zu lösen. Eine wäre zB, eine Integer Klasse zu schreiben, und dort sämtliches Fehlerhandling durchzuführen. Dies ist aber recht aufwändig, und nicht gerade trivial. Ich experimentiere momentan gerade selbst an sowas.
Eine andere Möglichkeit wäre, du suchst dir eine Bibliothek für grosse Zahlen, die ihren Wertebereich dynamisch anpasst. Allerdings ist dann auch mit Performancenachteilen zu rechnen. Was Gleitkommazahlen betrifft, die kennen zusätzlich "besondere" Zustände, zB NaN, -INF oder +INF. Damit kann man sicherlich auch noch was machen.
-
Ah.. das mit dem Float ist super. Hilft mir weiter.
Aber bei int ist das so eine sache. bei einer Gleichung die z.B. aus 25 Parametern besteht ist es sicherlich schwierig vor der Berechnung zu prüfen ob ein Überlauf stattfinden kann. Die Eigentliche Frage ist folgende:Nehmen wir an ich schreibe eine funktion int xx(int a, int b, int c, int d);
in der Funktion werden die 4 Werte adiert und zurückgeliefert.
liegt es jetzt am Benutzer der Funktion dafür zu sorgen, dass er der Funktion 4 Werte übergibt die bei einer Addition nicht zum Überlauf führen oder muss ich als Programmierer der Funktion einen Mechanismus einbauen der den Überlauf feststellt und eine Aushnehme wirft?
-
Das ist letzendlich deine Sache. Entweder du erklärst dem Anwender, daß er sich um solche Angelegenheiten kümmern soll (und erklärst es als "undefiniertes Verhalten", wenn zu große Eingabewerte kommen) oder du kümmerst dich selber um die Überprüfung.
PS: Du könntest auch einen eigenen Typ checked_int definieren, der jede Elementaroperation auf Bereichsüberlauf kontrolliert.