Unterschied zwischen long double und double in C und C++ [duplicate]

Lesezeit: 3 Minuten

Benutzer-Avatar
Benutzer1543957

Mögliches Duplikat:

langes Doppel gegen Doppel

Ich bin neu in der Programmierung und kann den Unterschied zwischen Long Double und Double in C und C++ nicht verstehen. Ich habe versucht, es zu googeln, konnte es aber nicht verstehen und war verwirrt. Kann jemand bitte helfen.?

  • Ich würde erwarten, dass dies von Ihrem Compiler abhängt. Hast du dir die Unterlagen angesehen?

    – Jonathan Holz

    8. Januar 2013 um 18:27 Uhr

  • Mein Compiler ist gcc-4.3.4

    – Benutzer1543957

    8. Januar 2013 um 18:28 Uhr

  • Der Unterschied ist die Größe. Sie können gleich sein, oder ein langes Doppel kann größer sein. Größer bedeutet, dass es größere (und kleinere) Werte und mit höherer Genauigkeit enthalten kann.

    – Codierer mit variabler Länge

    8. Januar 2013 um 18:28 Uhr

  • Der Unterschied besteht darin, dass jeder Typ mit long genauer ist und eine größere Reichweite hat als der Typ selbst ohne long, da er mehr Bytes verwendet.

    – Kevin

    8. Januar 2013 um 18:29 Uhr


  • @ Kevin Nicht ganz wahr – es kann präziser sein und/oder eine größere Reichweite haben, aber das ist nicht garantiert. Es gab und/oder gibt Plattformen/Compiler wo long int == intzum Beispiel…

    – Twalberg

    8. Januar 2013 um 18:40 Uhr

Benutzer-Avatar
grau verblassen

Um den C++-Standard zu zitieren, §3.9.1 ¶8:

Es gibt drei Fließkommatypen: Float, Double und Long Double. Der Typ double bietet mindestens so viel Präzision wie float und der Typ long double mindestens so viel Präzision wie double. Die Wertemenge vom Typ Float ist eine Teilmenge der Wertemenge vom Typ Double; die Wertemenge vom Typ Double ist eine Teilmenge der Wertemenge vom Typ Long Double. Die Wertdarstellung von Fließkommatypen ist implementierungsdefiniert. Ganzzahlige und Gleitkommatypen werden gemeinsam als arithmetische Typen bezeichnet. Spezialisierungen des Standard-Templates std::numeric_limits (18.3) sollen die maximalen und minimalen Werte jedes arithmetischen Typs für eine Implementierung spezifizieren.

Das heißt das double nimmt mindestens so viel Speicher für seine Darstellung wie float und long double mindestens so viel wie double. Dieser zusätzliche Speicher wird für eine genauere Darstellung einer Zahl verwendet.

Auf x86-Systemen float ist typischerweise 4 Byte lang und kann Zahlen speichern, die etwa 3 x 10³&sup8; und etwa 1,4 x 10&supmin;&sup4;&sup5; klein sind. Es ist ein IEEE 754 Zahl mit einfacher Genauigkeit das etwa 7 Dezimalstellen einer Bruchzahl speichert.

Auch auf x86-Systemen, double ist 8 Bytes lang und kann Zahlen im IEEE 754 speichern Format mit doppelter Genauigkeit, das einen viel größeren Bereich hat und Zahlen genauer speichert, etwa 15 Dezimalstellen. Auf einigen anderen Plattformen double darf nicht 8 Bytes lang sein und kann tatsächlich dasselbe sein wie eine Single-Precision float.

Die Norm verlangt nur das long double ist mindestens so genau wie doubledaher werden einige Compiler einfach behandeln long double als wäre es dasselbe wie double. Aber auf den meisten x86-Chips sind die 10-Byte Erweitertes Präzisionsformat 80-Bit-Zahlen sind über die Gleitkommaeinheit der CPU verfügbar, die sogar noch präziser als 64-Bit ist doublemit etwa 21 Dezimalstellen Genauigkeit.

Einige Compiler unterstützen stattdessen ein 16-Byte (128-Bit) IEEE 754 Zahlenformat mit vierfacher Genauigkeit mit noch präziseren Darstellungen und einer größeren Reichweite.

  • In der Praxis hat MSVC++ 2017 also ab 2021 immer noch sizeof(long double) mit dem gleichen Wert bewerten wie sizeof(double): 8 Byte, egal ob 32bit oder 64bit. ( docs.microsoft.com/en-us/vorherige-versionen/… )

    – Mike Wehr

    25. März 2021 um 6:05 Uhr

  • GCC und Clang geben beide 16 Bytes für long double unter Linux und GCC unter ARM gibt 8 Bytes. Ja, immer noch sehr plattformabhängig.

    – Grauschimmer

    1. April 2021 um 0:28 Uhr

Benutzer-Avatar
hmatar

Es hängt von Ihrem Compiler ab, aber der folgende Code kann Ihnen die Anzahl der Bytes zeigen, die jeder Typ benötigt:

int main() { 
    printf("%d\n", sizeof(double)); // some compilers print 8
    printf("%d\n", sizeof(long double)); // some compilers print 16
    return 0;
}

  • Gibt es eine Liste, welche Compiler was tun?

    – Aaron Franke

    28. März um 15:40 Uhr

EIN long <type> Datentyp kann halten größere Werte als a <type> Datentyp, je nach Compiler.

1012250cookie-checkUnterschied zwischen long double und double in C und C++ [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy