mit try floating overflow abfangen (anfängerfrage...)



  • Hi! ich habe von meinem neuen arbeitgeber ne übungsaufgabe bekommen, ich sollte nen taschenrechner programmiern...
    der taschenrechner bekommt nen String mit na formel und löst diese auf. Dabei auf ungültige sachen wie division durch Null zu prüfen iss leicht, allerdings habe ich ein anderes problem:
    Wenn ich zu große Zahlen bekomme dann gibts ein floating overflow...
    wie kann ich das nun abprüfen, und dann halt nen error zurückgeben wenn die zahlen zu groß werden?

    Ich wollte das ungefähr so haben:

    try
    		{
    		summe*=zsum;
    		}
    	catch(EMathError &m)
    		{
    		fIsok=0;
    		};
    	}
    

    ( so vom prinzip, funzen tut das ja leider nich so... )
    thx im vorraus 🙂

    wer den rechner mal austesten will: Rechner.exe
    ( funzt nur an PC wo Borland Turbo C++ installiert iss glaub ich (hab die umsonst version benutzt)

    edit: warum wird v o r r a u s zensiert?? lol



  • beatnukem schrieb:

    edit: warum wird v o r r a u s zensiert?? lol

    Genau, lol, @you.

    MfG



  • jo, weil man V o r r a u s so schreibt: Voraus.



  • die eigentliche frage steht weiter oben leut 🙂



  • Na und? Du lachst laut aus (Wohl das Forum und/oder uns), und dafür gibts keine Leckerlies!

    MfG



  • ceplusplus schrieb:

    Na und? Du lachst laut aus (Wohl das Forum und/oder uns), und dafür gibts keine Leckerlies!

    MfG

    also das forum oder euch wollt ich sicher nich auslachen...tut mir leid wenn du das so aufgefasst hast...



  • Wen denn sonst? ^^

    Naja egal, sry mit exceptions hab ich mich noch nicht beschäftigt.

    MfG



  • so spontan ist mir da auch noch nichts über den weg gelaufen. Ich glaube was wirklich einfaches wie ein try catch gibts da nicht. Zumal es ja im Assembler ein Overflow flag gibt der genau das anzeigt. Naja ggf könnte man versuchen einfach in den nächstgrößeren zahlenbereich zu schreiben und das Ergebnis vergleichen..

    also größere Variable anlegen dort berechnen ... in den kleineren bereich kopieren. Ergebnis vergleichen... es gibt glaube ich auch ein header wo der maximale Wert für alle veriablentypen deines Systems gespeichert ist. Aber k.A. wo man sowas findet.



  • hmm ok danke für die antwort...du meinst z.b. in nem long double berechnen und gucken obs über nen bestimmten wert geht? wenn ich das ergebnis vom größeren speicherbereich in den kleinen kopiere, dann gibts doch auch nen overflow oder irr ich mich da? greetz



  • Du prüfst im größeren Typ, also double max_float = std::numeric_limits< float >::max(); und dann if( val > max_float )...

    Alternativ kannst du auch unportabel werden und zumindest unter Windows das SEH (Structured Exception Handling) verwenden und (auch) Hardware-Exceptions abfangen.
    Die Syntax ist in Visual C++ geringfügig anders, statt try schreibst du __try und fängst die Excetion in einem __except-Block.

    Ein kleines Beispiel:

    __try
    {
      //hier die Berechnung
    }
    __except( GetExceptionCode() == EXCEPTION_FLT_OVERFLOW )
    {
      //war wohl zu groß
    }
    


  • Q lolz
    thx a lot das funzt wunderbar 😃
    genau sowas wollt ich haben


Anmelden zum Antworten