Ausgabeproblem bei 32/64 Rechner



  • Ich hoffe, ich bin hier in der richtigen Abteilung gelandet. Bei Bedarf bitte den Beitrag ins richtige Fach verschieben.

    Habe ein kleines Problem. Es geht um die Anzeige der Genauigkeit für Dezimalstellen.

    Das Programm auf einem Windowsrechner geschrieben:

    #include <stdio.h>
    #include <float.h>

    int main()

    {
    printf("FLT_DIG : %d\n" , FLT_DIG);
    printf("LDBL_DIG : %d\n" , LDBL_DIG);
    printf("DBL_DIG : %d\n",DBL_DIG);

    return 0;
    }

    Die Ausgabe in der Konsole:

    FLT_DIG 6
    LDBL_DIG 15
    DBL_DIG 15

    und genau in der letzen Zeile ist der Fehler - es müßte 18, statt 15 sein.

    Das Gleiche unter einem Linux-System mit 64Bit:

    FLT_DIG 6
    LDBL_DIG 15
    DBL_DIG 18

    Die Ausgabe ist korrekt. Die letzte Dezimalstelle wird auf 18 Stellen genau berechnet.

    Meine Frage geht jetzt in die Richtung ob die unterschiedliche Rechnerarchitektur Windows 32 bit System und Linux 64 bit zwei unterschiedliche Ausgabeergebnisse liefern?

    Ich stehe noch am Anfang des ganzen Programmierens, und ich gehe solchen Sachen gerne auf den Grund.

    Vielen Dank schon mal im Voraus

    Wolfgang


  • Mod

    Woher möchtest du wissen, was korrekt ist? Das System sagt dir, was korrekt ist, dafür sind diese Konstanten doch gerade da!

    Weiterhin passen Programm und Ausgabe nicht zusammen. Wenn du tatsächlich DBL_DIG > LDBL_DIG hast, dann ist da der Wurm drin. Ich nehme daher mal an, du meinst LDBL_DIG, auch wenn du vom DBL_DIG sprichst. Da ist die Antwort auf deine Frage, dass auf dem 32-Bit System long double eben identisch ist mit double. Das ist auch ganz normal und richtig so.



  • Sorry, ich meinte natürlich LDBL_DIG. Danke für die schnelle Antwort.

    Wolfgang



  • Meine Frage geht jetzt in die Richtung ob die unterschiedliche Rechnerarchitektur Windows 32 bit System und Linux 64 bit zwei unterschiedliche Ausgabeergebnisse liefern?

    Ja. 32bit Systeme sind meistens noch mit den ganz alten Intels kompatibel, da gab's noch keine größeren FPU-Register.
    Bei 64bit Systemen sieht das ganz anders aus.

    Ansonsten ist das Ganze auch Definitionssache. 64bit Unix definiert long int als 64bit Integer, Win64 als 32bit Integer. Ich bin mir sicher dass es auch bei long double ähnliche Freiheiten gibt. Dazu sind diese Konstanten da, damit du auch nur das nutzt was dir angeboten wird!



  • Ethon schrieb:

    Ja. 32bit Systeme sind meistens noch mit den ganz alten Intels kompatibel, da gab's noch keine größeren FPU-Register.
    Bei 64bit Systemen sieht das ganz anders aus.

    Das hat mit 32 vs. 64 Bit nix zu tun.
    Die Frage ist ob long double 64 oder 80 Bit verwendet.
    GCC unter Linux verwendet 80, MSVC 64.
    (GCC unter Windows verwendet vermutlich auch 64 Bit um kompatibel mit MSVC zu sein.)

    Können tut beides ein uralt Pentium schon.

    @Wolfgang K.
    Du hast da was verdreht.
    Wenn einer der beiden Werte grösser ist, dann muss das LDBL_DIG sein.
    Dass long double weniger Genauigkeit als double hat wäre reichlich beknackt.


Log in to reply