Warum sind c/c++ - floating-point-Typen, so seltsam benannt?
C++ bietet drei Fließkomma-Typen: float, double und long double. Ich habe selten mit floating-point in meinem code, aber wenn ich das mache, ich bin immer wieder gefangen von Warnungen auf harmlosen Zeilen wie
float PiForSquares = 4.0;
Das problem ist, dass die wörtliche 4.0 ist ein Doppel -, nicht-Schwimmer - und Das ist irritierend.
Für integer-Typen, wir haben short int, int und long int, das ist ziemlich einfach. Warum nicht C nur kurz, float, float und long float? Und wo auf der Erde haben "double" her?
EDIT: Es scheint die Beziehung zwischen floating-Typen ist ähnlich wie bei Ganzzahlen. doppelklicken Sie muss mindestens so groß wie float und long double mindestens so groß wie double. Keine anderen Garantien Präzision/Reichweite gemacht werden.
- 4.0 ist nicht ein string-literal ist; es ist double-literal!
- lange schweben existierte, bevor die Doppel-und Doppel wurde zu einem synonym für lange schweben; es wurde entfernt, in der C89-standard.
- was ich gern hätte ist "double float" 🙂
- Es gibt viele Garantien umliegenden
<float.h>
, insbesondere Dinge wie FLT_DIG (ich denke, es ist garantiert in der Lage sein zu vertreten, 5 Ziffern, also zahlen von 0 bis 99999).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Begriffe "single-precision" und "double precision" entstand in FORTRAN und waren schon weit, wenn C erfunden wurde. Am frühen 1970er Jahren Maschinen, einfacher Genauigkeit war deutlich effizienter und wie heute, verwendet halb so viel Speicher als double precision. Daher war es einen angemessenen Standard für floating-point-zahlen.
long double
war Hinzugefügt viel später, wenn der IEEE-standard gemacht, die Vergütungen für den Intel 80287 floating-point-chip, die 80-bit-floating-point-zahlen, anstatt in der klassischen 64-bit-double-precision.Fragesteller ist falsch über Garantien; heute nahezu allen Sprachen gewährleisten zu implementieren IEEE-754 binary floating-point-zahlen bei single-precision (32 bit) und doppelter Genauigkeit (64 bit). Einige bieten auch extended-precision (80 bits), die zeigt, bis in C als
long double
. Das IEEE-floating-point-standard, angeführt von William Kahan, war ein triumph des guten engineering über die Zweckmäßigkeit: auf die Maschinen der Tag, sah es zu teuer, aber auf den heutigen Maschinen ist es spottbillig, und die übertragbarkeit und Vorhersagbarkeit der IEEE floating-point-zahlen speichern, müssen Sie gazillions Dollar jedes Jahr.Werden Sie wahrscheinlich wusste dies, aber Sie kann machen literal Schwimmer/long Double
Doppel ist der default, weil es das ist, was die meisten Leute benutzen. Long Double kann overkill oder und Schwimmer haben sehr schlechte Präzision. Doppel-funktioniert für fast jede Anwendung.
Warum die Namensgebung? Eines Tages werden alle wir hatte war 32-bit-floating-point-zahlen (auch wirklich alles, was wir hatten, war fixed point zahlen, aber ich schweife ab). Wie auch immer, wenn floating-point wurde ein beliebtes feature in modernen Architekturen, C war wohl die Sprache dujour dann, und der name "float" gegeben wurde. Sinn zu machen schien.
An der Zeit, verdoppeln sich möglicherweise gedacht haben, aber nicht wirklich in der cpu implementierte s/fp cpus der Zeit, die waren 16 oder 32 bits. Einmal das Doppel wurde in mehr Architekturen, C wahrscheinlich gekommen, um zu hinzufügen es. C brauchte etwas, einen Namen für etwas doppelt so groß wie ein Schwimmer, daher bekamen wir ein Doppelzimmer. Dann wird jemand benötigt, noch mehr Präzision, wir dachten, er sei verrückt. Wir brachten es trotzdem. Der name quadtuple(?) übertrieben war. Long double war gut genug, und niemand machte eine Menge Lärm.
Teil der Verwirrung ist, dass gute ole "int" scheint sich zu ändern mit der Zeit. Es verwendet zu sein, dass "int" bedeutet 16-bit-integer. Float, aber gebunden an die IEEE std wie die 32-bit-IEEE-Gleitkomma-Zahl. Aus diesem Grund C gehalten float definiert als 32-bit und machte double und long double ist, verweisen auf die längere standards.
Literale
Mit Konstanten es gibt einen wichtigen Unterschied zwischen Ganzzahlen und Fließkommazahlen. Während es relativ einfach ist, zu entscheiden, welche integer-Typ zu verwenden (wählen Sie kleinsten genug, um halten Sie den Wert, mit einigen zusätzlichen Komplexität für signed/unsigned), mit Schwimmern ist es nicht so einfach ist. Viele Werte (einschließlich der einfachen wie 0.1) kann nicht genau dargestellt werden, die von float-zahlen und somit die Wahl der Art betrifft nicht nur die performance, sondern auch das Ergebnis Wert. Es scheint in der Sprache C Designer am günstigsten gelegene Robustheit gegenüber der Leistung in diesem Fall, und Sie beschlossen daher die Standard-Darstellung sollte genauer ein.
Geschichte
Die Begriffe "single-precision" und "double precision" entstand in FORTRAN und waren schon weit, wenn C erfunden wurde.
Erste, diese Namen sind nicht speziell um C++, sondern sind ziemlich gängige Praxis für alle Gleitkomma-Datentyp implementiert IEEE 754.
Den Namen "double" bezieht sich auf "double precision", während float wird oft gesagt, Sie sei 'single precision'.
Den beiden am gemeinsamen floating-point-Formate mit 32-bit und 64-bits, die länger ist "doppelklicken" Sie die Größe der erste, so wurde es als "Doppel".
Eines doppelt benannt ist, weil es ist die doppelte "Genauigkeit" von einem Schwimmer. Wirklich, was dies bedeutet, ist, dass es verwendet zweimal den Raum, der eine floating-point-Wert -- wenn Ihr float ist eine 32-bit, dann ist dein double wird ein 64-bit.
Den Namen double precision ist ein wenig irreführend, da ein double precision float hat eine Genauigkeit von Mantisse 52 bits, in denen ein single precision float hat eine Präzision der Mantisse 23 bits (double, 56). Mehr auf floating-point-hier: Floating-Point - Wikipedia, einschließlich
links am Ende der Artikel auf single-und double-precision-floats.
Den Namen long double ist wahrscheinlich nur auf der gleichen tradition wie die long-integer-vs. short integer für ganzzahlige Typen, außer in diesem Fall werden Sie Umgekehrt seit 'int' ist äquivalent zu 'long int'.
In fixed-point Darstellung, es gibt eine Feste Anzahl von Ziffern nach dem radix point (eine Verallgemeinerung der Punkt-dezimal-Darstellungen). Gegensatz dazu die floating-point-Darstellungen, wo der radix Punkt bewegen kann, oder schweben, in den Ziffern der Zahl vertreten. Daher auch der name "floating-point-Darstellung." Das war abgekürzt für "float".
In K&R C,
float
genannten floating-point-Darstellungen mit 32-bit-Binär-Darstellungen unddouble
genannten floating-point-Darstellungen mit 64-bit-binärdarstellungen, oder doppelt so groß und daher der name. Jedoch die original-K&R-Spezifikation erforderlich, dass alle Gleitkomma-Berechnungen durchgeführt werden, die in doppelter Genauigkeit.In der ursprünglichen IEEE-754-standard (IEEE 754-1985), der gold-standard für Gleitkomma-Darstellungen und arithmetische Definitionen waren für die binären Darstellungen der single-precision-und double-precision-floating-point-zahlen. Double-precision-zahlen waren treffend Namen, wie Sie dargestellt wurden durch doppelt so viele bits wie single-precision zahlen.
Ausführliche Informationen über floating-point-Darstellungen, Lesen Sie David Goldberg ist Artikel, , Was Jeder Computer Scientist should Know About Floating-Point Arithmetic.
Sind Sie als single-precision-und double-precision-denn Sie sind bezogen auf die Natürliche Größe (nicht sicher, der Begriff) der Prozessor. So ein 32-bit-Prozessor single-precision 32 bits lang, und seine doppelte Genauigkeit wäre double - 64 bit lang. Sie gerade beschlossen, rufen Sie die single-precision-Typ "float" in C.
Doppel ist die Abkürzung für "double precision".
ein long double ist, denke ich, kommt die nicht wollen, fügen Sie ein anderes Schlüsselwort ein, wenn eine floating-point-Typ mit noch höherer Präzision begann zu erscheinen, die auf Prozessoren.
Okay, historisch gesehen ist hier die Weise, die es verwendet zu sein:
Den original-Maschinen benutzt, für C hatte 16-bit-Worte aufgeteilt in 2 bytes, und ein char war ein byte. Adressen wurden von 16 bits, so
sizeof(foo*)
2 war,sizeof(char)
war 1. Ein int 16 bit, sosizeof(int)
war auch 2. Dann ist der VAX (erweiterte Adressierung) Maschinen kamen zusammen, und eine Adresse 32 bit. Ein char war immer noch 1 byte, abersizeof(foo*)
war nun die 4.Gab es einige Verwirrung, die sich fest in der Berkeley-Compiler, so dass eine kurze war jetzt 2 bytes, int 4 bytes, wie diejenigen, die waren gut geeignet, um effizienten code. Lange wurde 8 bytes, weil es eine effiziente Adressierung-Methode, die für 8-byte-Blöcken, - - -, die genannt wurden doppelte Wörter. 4-byte-Blöcke wurden Worte und sicher enugh, 2-byte-Blöcke wurden halfwords.
Die Umsetzung der floating-point-zahlen waren, so dass Sie passen in die einzelnen Wörter oder doppelte Wörter. Konsistent zu bleiben, die floating-point-doubleword Nummer war dann genannt "double".
long
, was natürlich war, 4 (gleiche wieint
) das BSD-vax-compiler... [die "Gleichwertigkeit" vonint
undlong
als Ursache für viele Fehler bei der Portierung Alter software auf 64-bit oder 16-bit) - Plattformen]Es sollte angemerkt werden, dass
double
NICHT in der Lage sein, Werte größer als in der Größenordnung denen vonfloat
; es muss nur mehr präzise.daher das %f für Typ "float", und ein " %lf für eine lange schweben, das ist das gleiche wie double.
printf
Funktion von C,%f
schon steht fürdouble
, während%Lf
steht fürlong double
. Für diescanf
Funktion sind Sie richtig wenn.