Gleitkommazahl einen Wert zuweisen der keine Zahl darstellt



  • Ja aber was hat das mit einem ungültigen double zu tun? Er will ja sowas wie:

    double x = NaN;
    Typ* ptr = NIL;
    

    Oder habe ich das falsch verstanden 😕

    BTW: DirectX bietet eine Funktion (okay, okay, es ist ein Makro) die das umwandelt, und das sieht imho auch um einiges besser aus als dieser Cast.

    MfG SideWinder



  • ahso, hab das mit nan nich beachtet...

    NaN = 0.0 / 0.0
    

    dass da der compiler nich meckert 🙄



  • Vielleicht ist in Google: numeric_limits ja was passendes dabei

    #include <limits>
    std::numeric_limits<T>::quiet_NaN()
    std::numeric_limits<T>::signaling_NaN()
    


  • Ich habe z.B. folgende Funktion:

    double rechne(double a,double b)
    {
      double c;
      try
      {
        c = a/b+1;
      }
      catch(...)
      {
        c = ???;
      }
      return c;
    }
    

    Die Frage ist was ich zurückgeben soll wenn eine Divison durch 0 auftritt. Ich kann ja nicht einfach 0 zurückgeben, da z.B. -5/5+1 auch 0 ergeben würde.



  • sorry hab den letzten Beitrag von otze nicht gelesen.
    Wenn ich c = 0.0 / 0.0 zurückgebe und das dann ausgebe erscheint tatsächlich "NAN".
    Vielen Dank für eure Hilfe!



  • Das kann aber auch daneben gehen... Ich hatte schon Fälle in denen eine Division durch 0.0 (nicht 0 ;)) eine Exception auslöste ⚠



  • Leider ist ein weiteres Problem aufgetreten:
    Wenn ich mit dieseem Wert jetzt weiter rechne wird er wie eine normal 0 behandelt, also wollte ich eine Abfrage

    if(c == 0.0/0.0)
    

    einbauen.
    Allerdings führt dies zu einer "ungültigen Gleitkommaoperation".
    Wie kann ich also abfragen ob in c jetzt 0 oder 0.0/0.0 steht?



  • du darfst nan nicht testen, dafür gibts in der vcl isNan(var);



  • Und im Standard Type-Traits (siehe oben)

    MfG SideWinder



  • Es tut mir leid, aber so ganz komm ich mit den Type-Traits nicht klar.
    Könnt ihr mir bitte (mit Quellcode) zeigen wie ich nun herausfinde ob in einer double-Variablen der Wert NAN steht oder nicht (ohne VCL).



  • In ANSI C gibt's dafür isnan oder isnanf (für floats). Ist doch wohl nicht so schwer. Dann gibt's auch noch isfinite, um auf unendlich zu testen.

    Wenn du die FPU Exceptions ausschaltest, dann kannst du auf das mühsame catch überhaupt verzichten und einfach das Ergebnis zurückliefern, das die FPU ausspuckt. (_control87 oder _fp8087 oder so ähnlich müsste das heißen)

    Wenn 0.0 / 0.0 im Code steht, besteht keine Gefahr, dass eine Exception auftritt, weil das schon der Compiler ausrechnet.





  • Aus der GCC Doku:

    * On 68000 and x86 systems, for instance, you can get paradoxical
    results if you test the precise values of floating point numbers.
    For example, you can find that a floating point value which is not
    a NaN is not equal to itself. This results from the fact that the
    floating point registers hold a few more bits of precision than
    fit in a `double' in memory. Compiled code moves values between
    memory and floating point registers at its convenience, and moving
    them into memory truncates them.

    You can partially avoid this problem by using the `-ffloat-store'
    option (*note Optimize Options::).



  • dann verwendet man eben als Kriterium, daß im NaN-Fall sowohl keine ">"-, "<"- als auch "="-Relation bestehen kann 😉

    natürlich würde ich immer die vorhandenen Funktionen einer Library einsetzen, aber es ging mir nur um die Machbarkeit auch ohne den Einsatz einer solchen Funktion (ok, ein wenig ging es mir auch darum, daß ich diese FAQs dort für eine der kompetentesten FAQ-Sammlungen halte, so daß "grobe Schnitzer" dort eigentlich nicht stehen und die Antworten dort schon verwertbar sind 🙂 )

    MfG


Anmelden zum Antworten