Warum haben C/C++-Gleitkommatypen so seltsame Namen?

Lesezeit: 7 Minuten

C++ bietet drei Fließkommatypen: Float, Double und Long Double. Ich verwende selten Gleitkommazahlen in meinem Code, aber wenn ich das tue, werde ich immer von Warnungen in harmlosen Zeilen wie

float PiForSquares = 4.0;

Das Problem ist, dass der Literal 4.0 ein Double ist, kein Float – was irritierend ist.

Für Integer-Typen haben wir short int, int und long int, was ziemlich einfach ist. Warum hat C nicht einfach Short Float, Float und Long Float? Und wo in aller Welt kommt “doppelt” her?

BEARBEITEN: Es scheint, dass die Beziehung zwischen Floating-Typen der von Ganzzahlen ähnlich ist. double muss mindestens so groß wie float sein und long double ist mindestens so groß wie double. Es werden keine weiteren Garantien für Genauigkeit/Reichweite gegeben.

  • 4.0 ist kein String-Literal; es ist doppelt wörtlich!

    – Jonathan Leffler

    30. Dezember 2008 um 0:16 Uhr

  • long float existierte vor double und double war ein Synonym für long float; es wurde aus dem C89-Standard entfernt.

    – Jonathan Leffler

    30. Dezember 2008 um 0:17 Uhr

  • was mir gefallen hätte wäre “double float” 🙂

    – Johannes Schaub – litb

    30. Dezember 2008 um 9:11 Uhr

  • Es gibt eine Menge von Garantien rund um <float.h>insbesondere Dinge wie FLT_DIG (ich denke, es ist garantiert in der Lage, 5 Dezimalstellen darzustellen, dh ganze Zahlen von 0 bis 99999).

    – tc.

    24. Juli 2012 um 17:50 Uhr

  • Diese SO-Frage könnte auch in Bezug auf die Namen “single” und “double” interessant sein.

    – zardoscht

    11. April 2020 um 17:29 Uhr


Die Begriffe „einfache Genauigkeit“ und „doppelte Genauigkeit“ stammt aus FORTRAN und waren bereits weit verbreitet, als C erfunden wurde. Auf Maschinen aus den frühen 1970er Jahren Single Precision war deutlich effizienter und verbrauchte wie heute halb so viel Speicher wie doppelte Genauigkeit. Daher war es ein angemessener Verzug für Fließkommazahlen.

long double war viel später hinzugefügt als der IEEE-Standard den Intel 80287 Floating-Point-Chip berücksichtigte, der 80-Bit-Gleitkommazahlen anstelle der klassischen 64-Bit-Double-Precision verwendete.

Der Fragesteller ist in Bezug auf Garantien falsch; heute Fast alle Sprachen garantieren die Implementierung von binären Fließkommazahlen nach IEEE 754 mit einfacher Genauigkeit (32 Bit) und doppelter Genauigkeit (64 Bit). Einige bieten auch an erweiterte Präzision (80 Bit), was in C als angezeigt wird long double. Der IEEE-Gleitkommastandard, angeführt von William Kahan, war ein Triumph guter Technik über Zweckmäßigkeit: Auf den Maschinen von damals sah es unerschwinglich teuer aus, aber auf den heutigen Maschinen ist es spottbillig und die Portabilität und Vorhersagbarkeit von IEEE Floating -Punktzahlen müssen jedes Jahr Milliarden von Dollar einsparen.

  • Das OP spricht von C und C ++, von denen keines IEEE 754 garantiert.

    – Robert Gamble

    30. Dezember 2008 um 5:09 Uhr

  • c++ hat ein Flag, um zu sehen, ob ieee754 implementiert ist oder nicht: numeric_limits::is_iec559

    – Johannes Schaub – litb

    30. Dezember 2008 um 9:53 Uhr

  • Ähnlich hat C99 die STDC_IEC_559 Makro, aber diese testen nur, ob die Implementierung vorgibt, IEEE zu verwenden. Was ich dagegen habe, ist die Aussage “Fragesteller ist falsch in Bezug auf Garantien”, wenn C/C++ kein IEEE-Gleitkomma garantiert.

    – Robert Gamble

    30. Dezember 2008 um 13:27 Uhr

  • Ich bezweifle auch die Behauptung, dass „fast alle [modern] Sprachen garantieren die Implementierung von binären IEEE 754-Gleitkommazahlen”. Von allen Sprachen, die ich verwende, kann ich mir nur eine vorstellen, von der ich weiß, dass sie dies garantiert.

    – Robert Gamble

    30. Dezember 2008 um 13:28 Uhr

  • “Single Precision” ist nicht wirklich ein Fortran-Begriff. fortran hat/hatte “real” und “double precision”.

    – Roddy

    30. Dezember 2008 um 22:04 Uhr

Benutzer-Avatar
Doug T.

Sie wussten das wahrscheinlich, aber Sie kann Machen Sie buchstäbliche Floats/Long Doubles

 float f = 4.0f;
 long double f = 4.0l;

Double ist die Standardeinstellung, weil dies die meisten Leute verwenden. Lange Doubles können übertrieben sein oder Floats haben eine sehr schlechte Präzision. Double funktioniert für fast jede Anwendung.

Warum die Namensgebung? Eines Tages waren alles, was wir hatten, 32-Bit-Gleitkommazahlen (nun, eigentlich alles, was wir hatten, waren Festkommazahlen, aber ich schweife ab). Wie dem auch sei, als Floating Point zu einem beliebten Feature in modernen Architekturen wurde, war C wahrscheinlich damals die Sprache, die dujour war, und der Name “float” wurde gegeben. Schien sinnvoll.

Zu der Zeit wurde Double möglicherweise angedacht, aber nicht wirklich in den CPUs/FP-CPUs der damaligen Zeit implementiert, die 16 oder 32 Bit waren. Als das Double in mehr Architekturen verwendet wurde, kam C wahrscheinlich dazu, es hinzuzufügen. C brauchte etwas, einen Namen für etwas, das doppelt so groß ist wie ein Float, daher haben wir ein Double. Dann brauchte jemand noch mehr Präzision, wir hielten ihn für verrückt. Wir haben es trotzdem hinzugefügt. Der Name Quadtuple(?) war übertrieben. Langes Doppel war gut genug, und niemand machte viel Lärm.

Ein Teil der Verwirrung besteht darin, dass sich das gute alte “int” mit der Zeit zu ändern scheint. Früher bedeutete “int” 16-Bit-Integer. Schwimmer ist jedoch an die gebunden IEEE-Std als 32-Bit-IEEE-Gleitkommazahl. Aus diesem Grund behielt C Float als 32 Bit definiert und machte Double und Long Double, um auf die längeren Standards zu verweisen.

  • Vielen Dank. aber wenn “float” der ursprüngliche Typ war, warum sind Literale dann doppelt? Und ich finde die IEEE-Erklärung nett – aber falsch: IEEE-754 wurde ’85 veröffentlicht…

    – Roddy

    30. Dezember 2008 um 0:04 Uhr

  • Nun, war Float vor 1985 Teil des C-Standards? Es ist sehr wahrscheinlich, dass Menschen lange Zeit Festkommaarithmetik verwendet haben.

    – Doug T.

    30. Dezember 2008 um 0:05 Uhr

  • IIRC, die Begriffe „float“ für 32-Bit-Float und „double“ für 64-Bit-Double gehen weit zurück bis in die 60er Jahre, bevor C konzipiert wurde. Wahrscheinlich mit der IBM 360-Architektur entstanden

    – Sterben in Sente

    30. Dezember 2008 um 0:59 Uhr

  • “Sehr schlechte Genauigkeit” – teilen Sie das Ihrem Grafikkartenhersteller mit. Alle GPUs und im Grunde alle Grafiken werden mit Floats ausgeführt.

    – tschüss

    30. Dezember 2008 um 4:25 Uhr

  • C89 Float kann IEE754 sein, muss es aber nicht.

    – MSalter

    2. Januar 2009 um 15:05 Uhr

Literale

Das Problem ist, dass der Literal 4.0 ein Double ist, kein Float – was irritierend ist.

Bei Konstanten gibt es einen wichtigen Unterschied zwischen Ganzzahlen und Floats. Während es relativ einfach ist, zu entscheiden, welcher Integer-Typ verwendet werden soll (Sie wählen den kleinsten Typ aus, der ausreicht, um den Wert zu speichern, mit etwas zusätzlicher Komplexität für signierte/unsignierte), ist dies bei Floats nicht so einfach. Viele Werte (einschließlich einfacher Werte wie 0,1) können nicht exakt durch Gleitkommazahlen dargestellt werden, und daher wirkt sich die Wahl des Typs nicht nur auf die Leistung, sondern auch auf den Ergebniswert aus. Es scheint, dass Designer der Programmiersprache C in diesem Fall Robustheit gegenüber Leistung bevorzugten und daher entschieden haben, dass die Standarddarstellung die genauere sein sollte.

Geschichte

Warum hat C nicht einfach Short Float, Float und Long Float? Und wo in aller Welt kommt “doppelt” her?

Die Begriffe „Single Precision“ und „Double Precision“ stammen aus FORTRAN und waren bereits weit verbreitet, als C erfunden wurde.

Erstens sind diese Namen nicht spezifisch für C++, sondern ziemlich gängige Praxis für jeden Fließkomma-Datentyp, der IEEE 754 implementiert.

Der Name „Double“ bezieht sich auf „Double Precision“, während Float oft als „Single Precision“ bezeichnet wird.

Die beiden gebräuchlichsten Fließkommaformate verwenden 32-Bit und 64-Bit, das längere ist “doppelt” so groß wie das erste, daher wurde es als “Double” bezeichnet.

Benutzer-Avatar
EdCarrel

Ein Double wird so genannt, weil es die doppelte “Genauigkeit” eines Floats hat. Das bedeutet wirklich, dass es doppelt so viel Platz wie ein Fließkommawert benötigt – wenn Ihr Float ein 32-Bit-Wert ist, dann ist Ihr Double ein 64-Bit-Wert.

Der Name Double Precision ist etwas irreführend, da ein Double Precision Float eine Mantissenpräzision von 52 Bit hat, während ein Single Precision Float eine Mantissenpräzision von 23 Bit hat (Double entspricht 56). Mehr zu Fließkommazahlen hier: Fließkomma – Wikipediaeinschließlich Links unten zu Artikeln über Floats mit einfacher und doppelter Genauigkeit.

Der Name long double hat wahrscheinlich dieselbe Tradition wie der Long Integer vs. Short Integer für ganzzahlige Typen, außer dass sie ihn in diesem Fall umgekehrt haben, da ‘int’ äquivalent zu ‘long int’ ist.

Benutzer-Avatar
Jason

Bei der Festkommadarstellung gibt es eine feste Anzahl von Ziffern nach dem Radixpunkt (eine Verallgemeinerung des Dezimalpunkts in Dezimaldarstellungen). Im Gegensatz dazu kann sich der Basispunkt innerhalb der Ziffern der dargestellten Zahl bewegen oder schweben. Daher der Name “Gleitkommadarstellung”. Dies wurde mit “Float” abgekürzt.

Bei K&R C, float bezeichnet Fließkommadarstellungen mit 32-Bit-Binärdarstellungen und double beziehen sich auf Gleitkommadarstellungen mit 64-Bit-Binärdarstellungen oder verdoppeln die Größe und daher der Name. Die ursprüngliche K&R-Spezifikation erforderte jedoch, dass alle Gleitkommaberechnungen mit doppelter Genauigkeit durchgeführt wurden.

Im ursprünglichen IEEE 754-Standard (IEEE 754-1985), dem Goldstandard für Gleitkommadarstellungen und Arithmetik, wurden Definitionen für binäre Darstellungen von Gleitkommazahlen mit einfacher und doppelter Genauigkeit bereitgestellt. Zahlen mit doppelter Genauigkeit wurden treffend benannt, da sie durch doppelt so viele Bits wie Zahlen mit einfacher Genauigkeit dargestellt wurden.

Ausführliche Informationen zu Gleitkommadarstellungen finden Sie in David Goldbergs Artikel, Was jeder Informatiker über Gleitkommaarithmetik wissen sollte.

1093150cookie-checkWarum haben C/C++-Gleitkommatypen so seltsame Namen?

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

Privacy policy