Frage zu double/integer Umwandlung



  • Hallo!

    In unserer Datenbasis werden best. Eigenschaften über die letzte Ziffer einer ID definiert.

    Um die letzte Ziffer der ID zu bekommen habe ich folgende Funktion geschrieben:

    int GetConnTypeFromPID (int Pid, int Debug){
    double fPid;
      if (Debug) printf("PID: %i\n",Pid);
      fPid=(double)Pid;
      fPid=fPid/10.;
      fPid=fPid-floor(fPid);
      fPid=fPid*100.;
      Pid=(int)fPid + 1;//muß sein, sonst ergibt (int) 1.000000 = 0
      Pid=Pid/10;
      if (Debug) printf("Pid: %i\n",Pid);
      return( Pid );
    }
    

    Das klappt soweit ganz gut, nur muß ich einmal eine 1 addieren (siehe Kommentar in Zeile 8), damit ich auch 1 bekomme, wenn der double-Wert 1.00 ist.
    Mit float ist der Effekt der gleiche.

    Warum ist das so?

    Ciao

    OkkaPapa



  • Warum machst du nicht

    Pid = Pid % 10;
    

    Fließkommazahlen sind nur ungefähre Werte. Damit kann man manche (viele) Zahlen nicht exakt abbilden.
    Dadurch kommt es zu Rundungsfehlern.



  • Und für den Nachkommaanteil einer Fließkommazahl gibt es die Funktion modf



  • Hallo!
    Danke für die Tipps, aber das beantwortet meine Frage nicht so ganz.

    In F77 konnte ich das so machen und hatte nur mit einfach genauen Zahlen manchmal Rundungsfehler.

    Bislang bin ich davon ausgegangen, daß C auf der binären Ebene die gleichen Genauigkeiten hinkriegt, sind im Endeffekt ja nur Nullen und EInsen aus denen sich die Zahl zusammensetzt.

    Ciao

    OkkaPapa



  • Das kommt drauf an, ob dein Fortran Compiler dasselbe Floating-Point Format benutzt, wie dein C Compiler (meistens IEEE 754, mit float = 32Bit).
    In C gibt es auch noch double und long double, die genauer sind.


Anmelden zum Antworten