Problem mit Float 1.#INF, -1.#INF ?



  • Hallo zusammen. Hier ist mein Code

     ... Code ... 
    ```FL8 f8=FL8_MAX;
          f8*=2;
          const CString s1=FL8ToStr (f8);
          INFO (s1);
          FL8 f82=-1;
          f82=StrToFL8 (s1);
          const CString s2=FL8ToStr (f82);
          INFO (s2);```
    
    
    s1 wird nicht den Wert von f8 habe sonst 1.#INF, deswegen wird s2 nur als 1 definiret.
    Die Frage:
    1- Ist es möglich, das Probem von 1.#INF zu lösen und Wie .
    2-oder eine Fehlermeldung in der methode von FL8ToStr (); zu programmieren .


  • Zu 1: Welches Problem genau? Bei f8*=2 würde eine Zahl entstehen die zu gross für den Typ FL8 ist, daher wird die "special value" 1.#INF (positive infinity) statt des ergebnisses abgespeichert. Das sind nunmal die Regeln. Und FL8ToStr() gibt bei "positive infinity" halt den String "1.#INF" zurück.

    Zu 2: Wenn du FL8ToStr modifizieren kannst, dann kannst du natürlich "eine Fehlermeldung programmieren". Die Frage ist nur: Wie soll diese Fehlermeldung aussehen?

    Die "korrekte" Lösung wäre vermutlich der Funktion StrToFL8 beizubringen die Strings 1.#INF und -1.#INF korrekt zu parsen.



  • @hustbaer
    Danke dir zu 1 das sind Regeln.

    FL8ToStr kann man modifizieren, deswegen hab mir gedacht, dass ich eine Massgebox als INFO programmiere, wenn die Zahl größer als FL8_MAX .
    aber warum wird f82 durch f82=StrToFL8 (s1); nicht die gleiche wert wie f8 egal ob es 1.#INF. sonderen 1.



  • @rare sagte in Problem mit Float 1.#INF, -1.#INF ?:

    FL8ToStr kann man modifizieren, deswegen hab mir gedacht, dass ich eine Massgebox als INFO programmiere, wenn die Zahl größer als FL8_MAX .

    Halte ich für keine gute Idee. Bei den allermeisten Funktionen die man so schreibt wäre es schlecht, wenn diese eine MessageBox anzeigen würden um Probleme (Fehler/Warnungen) zu kommunizieren. Stell dir vor du liest ein Datenfile ein mit zigtausend Zeilen, und musst dann zigtausendmal auf "OK" klicken wenn in dem File entsprechend viele "problematische" Zeilen vorhanden sind.

    Bzw. noch schlimmer: wenn das Programm automatisiert laufen soll. Da sieht dann nichtmal jemand dass ne MessageBox aufgeht, sondern das Programm bleibt einfach hängen.

    aber warum wird f82 durch f82=StrToFL8 (s1); nicht die gleiche wert wie f8 egal ob es 1.#INF. sonderen 1.

    Naja weil StrToFL8 offenbar so implementiert ist dass es "1.#INF" nicht korrekt erkennt. Ich würde vermuten dass StrToFL8 einfach Zeichen einliest so lange diese zu einer dezimalen Darstellung einer Zahl passen. Und dann abbricht und das bis dahin errechnete Ergebnis zurückgibt. Und das ist dann eben 1 bei "1.#INF" (Abbruch nach "1.").


Anmelden zum Antworten