Over- und Underflow erkennen...?



  • Hi,

    das eigentliche Problem ist das Auffinden der Überschreitung von Wertebereichen.
    Eine Möglichkeit wäre Underflow und Overflow zu unterbinden und stattdessen eine Exception werfen zu lassen, aber das geht wahrscheinlich nicht, oder?
    Jedenfalls ist es nötig, weil ich bei meinem kleinen Rechner gerne vermeiden möchte, dass dort verfälschte Ergebnisse auf Grund von zu hohen Zahlen entstehen.

    Mfg Eisflamme

    PS: Zakre, ich bin heute zu früh zu müde. Bitte nach C++ verschieben.



  • '+'   +   '+' =   +
    '-'   +   '-' =   -
    '+'   +   '-' =   (keine Gefahr) 
    '+'   *   '+' =   +
    ...
    

    Du musst nach jeder Operation das Vorzeichen prüfen (z.B. Operatoren überladen). Bei unsigned hast du ein echtes Problem.



  • Du könntest das Ergebnis im nächstgrößeren Datentyp speichern. Oder mit inline-Assembler das Carry-Flag überprüfen.
    Beide Möglichkeiten sind leider nicht portabel.



  • Dieser Thread wurde von Moderator/in kingruedi aus dem Forum Themen rund um Offtopic in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • @Optimizer: Es kann nach '+' * '+' genauso wieder + rauskommen, obwohl bereits eine Runde mehr gedreht wurde oder?

    MfG SideWinder



  • Stimmt, bei '*' funktioniert es nicht. Überhaupt funktioniert auch das Überladen der Operatoren nicht. Es war halt schon spät. 🙂



  • Und ich sehe bei complex<long double> leider auch nicht einen nächst-größeren Typen. 😞
    Es lässt sich da wirklich nichts machen? Wie machen das dann die besseren Rechner, die geben dann doch auch nichts Falsches aus, sondern melden, dass die Zahl zu groß ist.

    MfG Eisflamme



  • Bei double musst du doch auf infinity prüfen, das läuft nicht einfach so über.

    Wie machen das dann die besseren Rechner, die geben dann doch auch nichts Falsches aus, sondern melden, dass die Zahl zu groß ist.

    Dein Prozessor weiss das auch, dazu musst du halt ein spezielles Register abfragen.



  • Inwiefern ist das nicht kompatibel?



  • Kompatibel? Protabel? Was meinst du?
    Das Register abfragen erfordert AFAIK, dass du das in Assembler h4xX0r5t.
    Das betrifft jetzt aber nicht die Fließkommazahlen.
    Bei denen musst du nur nach jeder Operation das Ergebnis mit dem Wert für POSITIVE_INFINITY und NEGATIVE_INFINITY (so heissts bei Java) vergleichen. Allerdings frage ich mich echt, wie du einen long double zum Überlaufen kriegst?! Da geht doch ne 300stellige Zahl rein, oder?



  • Hi,

    na ja, ich arbeite nur mit Fließkommazahlen, allerdings gibt es da auch diverse Rechenfehler, die ich mir gerade nicht erklären kann (keine Ungenauigkeit), ich werde diesbezüglich noch etwas testen.
    Und bei Fließkommazahlen kann man pauschal nicht sagen, wie viele Stellen eine Zahl hat, weil solche Variablen allgemein anders aufgebaut sind.

    Nagut, vielleicht ergibt sich dadurch sogar mehr, bei VC6.0 habe ich jetzt das Problem, dass ich nur 80 Bit für long double habe...

    MfG Eisflamme 🙂



  • Das ist mir schon klar, dass die Genauigkeit abnimmt. Aber du hast von Overflow gesprochen und das hat mich halt gewundert. 🙂



  • Ja, stimmt. 🙄


Anmelden zum Antworten