In meiner Programmiererfahrung muss ich häufig eine Entscheidung treffen, ob ich float oder double für mein real verwenden soll Zahlen. Manchmal gehe ich schwimmen, manchmal gehe ich doppelt, aber das fühlt sich wirklich subjektiver an. Wenn ich konfrontiert würde, um meine Entscheidung zu verteidigen, würde ich wahrscheinlich keine stichhaltigen Gründe nennen.
Wann verwenden Sie float und wann verwenden Sie double? Verwenden Sie immer double, nur wenn Speicherbeschränkungen vorhanden sind, entscheiden Sie sich für float? Oder verwenden Sie immer float, es sei denn, die Präzisionsanforderung erfordert die Verwendung von double? Gibt es einige wesentliche Unterschiede hinsichtlich der rechnerischen Komplexität der Grundrechenarten zwischen float und double? Was sind die Vor- und Nachteile von Float oder Double? Und haben Sie sogar Long Double verwendet?
Kommentare
- In vielen Fällen möchten Sie weder einen, noch einen dezimalen Gleitkomma- oder Festkommatyp verwenden. Binäre Gleitkommatypen können ‚ die meisten Dezimalstellen nicht genau darstellen.
- Bezogen auf Was verursacht Gleitkomma-Rundungsfehler? ? . @CodesInChaos Meine Antwort Es werden Ressourcen vorgeschlagen, die Ihnen bei dieser Entscheidung helfen. Es gibt keine Einheitslösung .
- Was genau meinst du mit “ Dezimalstellen „. Wenn Sie Werte wie 0,01 genau darstellen müssen (z. B. für Geld), ist (binärer) Gleitkomma nicht die Antwort. Wenn Sie nur nicht ganzzahlige Zahlen meinen, ist Gleitkomma wahrscheinlich in Ordnung – aber “ Dezimalstellen “ ist nicht das beste Wort
- Wenn man bedenkt, dass die meisten Grafikkarten (ab heute) Floats über Doppel akzeptieren, verwendet die Grafikprogrammierung häufig eine einfache Genauigkeit.
- Sie verwenden nicht ‚ habe nicht immer die Wahl. Auf der Arduino-Plattform entsprechen beispielsweise Double und Float Float. Sie müssen eine Add-In-Bibliothek finden, um echte Doppelbilder zu verarbeiten.
Antwort
Die Standardauswahl für a Der Gleitkommatyp sollte double
sein. Dies ist auch der Typ, den Sie mit Gleitkomma-Literalen ohne Suffix oder (in C) Standardfunktionen erhalten, die mit Gleitkommazahlen arbeiten (z. B. exp
, usw.).
float
sollte nur verwendet werden, wenn Sie mit vielen Gleitkommazahlen arbeiten müssen (denken Sie an Die Größenordnung von Tausenden oder mehr) und die Analyse des Algorithmus haben gezeigt, dass der reduzierte Bereich und die reduzierte Genauigkeit kein Problem darstellen.
long double
kann verwendet werden, wenn Sie benötigen mehr Reichweite oder Genauigkeit als double
und wenn dies auf Ihrer Zielplattform möglich ist.
Zusammenfassend float
und long double
sollten für die Verwendung durch Spezialisten reserviert werden, double
für die „tägliche“ Verwendung.
Kommentare
- Ich würde Float wahrscheinlich nicht für einige tausend Werte in Betracht ziehen, es sei denn, es gab ein Leistungsproblem im Zusammenhang mit Gleitkomma-Cachin g und Datenübertragung. Die Analyse ist normalerweise mit erheblichen Kosten verbunden, um zu zeigen, dass float genau genug ist.
- Wenn Sie als Nachtrag Kompatibilität mit anderen Systemen benötigen, kann es vorteilhaft sein, dieselben Datentypen zu verwenden.
- Ich ‚ würde Floats für Millionen von Zahlen verwenden, nicht für 1000er. Einige GPUs eignen sich auch besser für Floats. In diesem speziellen Fall werden Floats verwendet. Verwenden Sie ansonsten, wie Sie sagen, Doppelte.
- @PatriciaShanahan – ‚ Leistungsproblem im Zusammenhang mit .. ‚ A. Ein gutes Beispiel ist, wenn Sie planen, SSE2 oder ähnliche Vektoranweisungen zu verwenden, können Sie 4 Operationen / Vektor in Float ausführen (gegenüber 2 pro Doppel), was zu einer signifikanten Geschwindigkeitsverbesserung führen kann (halb so viele Operationen und halb so viele Daten zum Lesen & schreiben). Dies kann den Schwellenwert erheblich senken, bei dem die Verwendung von Floats attraktiv wird, und es lohnt sich, die numerischen Probleme zu lösen.
- Ich unterstütze diese Antwort mit einem zusätzlichen Hinweis: Wenn man mit RGB-Werten für die Anzeige arbeitet, ist dies der Fall Es ist akzeptabel,
float
(und gelegentlich mit halber Genauigkeit) zu verwenden, da weder das menschliche Auge, das Display noch das Farbsystem so viele Genauigkeiten aufweisen. Dieser Hinweis gilt beispielsweise für OpenGL usw. Dieser zusätzliche Hinweis gilt nicht für medizinische Bilder, für die strengere Präzisionsanforderungen gelten.
Antwort
Es gibt selten einen Grund, float anstelle von double im Code für moderne Computer zu verwenden. Die zusätzliche Präzision verringert (beseitigt jedoch nicht) die Wahrscheinlichkeit von Rundungsfehlern oder anderen Ungenauigkeiten, die Probleme verursachen.
Die Hauptgründe für die Verwendung von float sind:
- Sie speichern große Zahlenfelder und müssen den Speicherverbrauch Ihres Programms reduzieren.
- Sie zielen auf ein System ab, das Gleitkommazahlen mit doppelter Genauigkeit nicht unterstützt. Bis vor kurzem unterstützten viele Grafikkarten nur Gleitkommazahlen mit einfacher Genauigkeit. Ich bin mir sicher, dass es viele stromsparende und eingebettete Prozessoren gibt, die auch nur eine begrenzte Gleitkomma-Unterstützung bieten.
- Sie zielen auf Hardware ab, bei der die einfache Genauigkeit schneller als die doppelte Genauigkeit ist und Ihre Anwendung stark genutzt wird Auf Gleitkomma-Arithmetik. Bei modernen Intel-CPUs werden meiner Meinung nach alle Gleitkomma-Berechnungen mit doppelter Genauigkeit durchgeführt, sodass Sie hier nichts gewinnen.
- Sie führen eine Optimierung auf niedriger Ebene durch, z. B. mithilfe spezieller CPU-Anweisungen, die mit mehreren Zahlen gleichzeitig arbeiten.
Im Grunde ist also der Weg zu double Gehen Sie, es sei denn, Sie haben Hardwareeinschränkungen oder die Analyse hat gezeigt, dass das Speichern von Zahlen mit doppelter Genauigkeit erheblich zur Speichernutzung beiträgt.
Kommentare
- “ Moderne Computer “ bedeuten Intel x86-Prozessoren. Einige der von den Alten verwendeten Maschinen lieferten mit dem Grundschwimmertyp eine vollkommen ausreichende Präzision. (Der CDC 6600 verwendete ein 60-Bit-Wort, 48 Bit normalisierte Gleitkomma-Mantisse, 12 Bit Exponent. Das ‚ ist FAST das, was der x86 für doppelte Genauigkeit bietet.)
- @ John.R.Strohm: stimmte zu, aber C-Compiler waren auf CDC6600 nicht vorhanden. Es war Fortran IV …
- Mit “ modernen Computern “ meine ich jeden Prozessor, der im letzten Jahrzehnt gebaut wurde oder zwei oder wirklich, da der IEEE-Gleitkomma-Standard weit verbreitet war. Ich ‚ bin mir vollkommen bewusst, dass Nicht-x86-Architekturen existieren, und habe dies bei meiner Antwort berücksichtigt – ich habe GPUs und eingebettete Prozessoren erwähnt, die normalerweise nicht x86 sind.
- Das ‚ ist jedoch einfach nicht wahr. SSE2 kann 4 Floats oder 2 Double in einem Arbeitsgang manipulieren, AVX kann 8 Floats oder 4 Double manipulieren, AVX-512 kann 16 Floats oder 8 Double manipulieren. Für jede Art von Hochleistungsrechnen sollte Mathematik auf Floats als doppelt so schnell wie die gleichen Operationen auf Doppel auf x86 angesehen werden.
- Und ‚ s Schlimmer noch, da Sie doppelt so viele Floats in den Prozessor-Cache einfügen können wie mit Double, und die Speicherlatenz wahrscheinlich der größte Engpass in vielen Programmen ist. Das Warmhalten eines ganzen funktionierenden Satzes von Floats im Cache kann buchstäblich eine Größenordnung schneller sein als das Verwenden von Doubles und das Verschütten in den RAM.
Antwort
Verwenden Sie double
für alle Ihre Berechnungen und temporären Variablen. Verwenden Sie float
, wenn Sie ein Array von Zahlen pflegen müssen – float[]
(wenn die Genauigkeit ausreicht), und Sie haben es mit über zehn zu tun Tausende von float
Zahlen.
Viele / die meisten mathematischen Funktionen oder Operatoren konvertieren / geben double
zurück, und Sie ziehen an “ Sie möchten die Zahlen für Zwischenschritte nicht auf float
zurücksetzen.
ZB Wenn Sie eine Eingabe von 100.000 Zahlen aus einer Datei oder einem Stream haben und dies müssen Sortieren Sie sie und geben Sie die Zahlen in eine float[]
ein.
Antwort
Einige Plattformen (ARM Cortex-M2, Cortex-M4 usw.) double wird nicht unterstützt (Dies kann immer im Referenzhandbuch überprüft werden Wenn keine Kompilierungswarnungen oder -fehler vorliegen, bedeutet dies nicht, dass der Code optimal ist. double kann emuliert werden .). Aus diesem Grund müssen Sie sich möglicherweise an int oder float .
Wenn dies nicht der Fall ist, würde ich double verwenden.
Sie können den berühmten Artikel von D. Goldberg lesen („Was jeder Informatiker über Gleitkomma-Arithmetik wissen sollte“). Sie sollten zweimal überlegen, bevor Sie Gleitkomma-Arithmetik verwenden. Es besteht eine ziemlich große Chance, dass sie in Ihrer speziellen Situation überhaupt nicht benötigt werden.
http://perso.ens-lyon.fr/jean-michel.muller/goldberg.pdf
Kommentare
- Diese Frage wurde bereits vor einem Jahr ziemlich gut beantwortet …Aber auf jeden Fall würde ich ‚ sagen, wann immer Sie ‚ auf Plattformen mit FPU-Beschleunigung mit doppelter Genauigkeit double verwenden, sollten Sie verwenden Dies gilt auch dann, wenn der Compiler dies emulieren lässt, anstatt nur eine FPU mit Gleitkomma zu nutzen (beachten Sie, dass FPUs ‚ nicht nicht auf allen Plattformen erforderlich, tatsächlich definiert eine Cortex-M4-Architektur sie als optionale Funktion [war M2 ein Tippfehler?]).
- Der Schlüssel zu dieser Logik ist, während ‚ ist wahr, man sollte der Gleitkomma-Arithmetik überdrüssig sein, und ‚ gibt es viele “ quirks „, wobei die FPU-Unterstützung für Doubles definitiv nicht berücksichtigt wird, um einfach Doubles anstelle von Floats zu verwenden. Floats sind im Allgemeinen schneller als Double und benötigen weniger Speicher (die FPU-Funktionen variieren). Das Nutzungsvolumen verhindert, dass dieser Punkt vorzeitig optimiert wird. Ebenso ist die Tatsache, dass Doppel für viele (vielleicht sogar die meisten) Anwendungen eindeutig übertrieben sind. Müssen die relativen Positionen und Größen der Elemente auf dieser Seite wirklich auf 13 Dezimalstellen berechnet werden?
- Wenn Sie einen Link zu einer externen Seite oder einem Dokument einfügen, kopieren Sie bitte die relevante Informationen oder eine Zusammenfassung aus dem Dokument in Ihre Antwort. Off-Site-Links verschwinden im Laufe der Zeit.
Antwort
Bei Problemen in der realen Welt beträgt die Stichprobenschwelle von Ihre Daten sind wichtig für die Beantwortung dieser Frage. In ähnlicher Weise ist auch das Grundrauschen wichtig. Wenn einer von beiden durch Ihre Datentypauswahl überschritten wird, hat die Erhöhung der Genauigkeit keinen Vorteil.
Die meisten realen Sampler sind auf 24-Bit-DACs beschränkt. Es wird vorgeschlagen, dass 32 Bit Genauigkeit bei Berechnungen in der realen Welt ausreichend sein sollten, wenn der Signifikand 24 Bit Genauigkeit beträgt.
Doppelte Genauigkeit kostet 2x Speicher. Daher könnte die Einschränkung der Verwendung von Doubles über Floats den Speicherbedarf / die Bandbreite laufender Anwendungen drastisch reduzieren.
Antwort
Die Auswahl von Welche Variable zwischen float und double verwendet werden soll, hängt von der Genauigkeit der erforderlichen Daten ab. Wenn eine Antwort einen vernachlässigbaren Unterschied zur tatsächlichen Antwort aufweisen muss, ist die Anzahl der erforderlichen Dezimalstellen groß. Dies bestimmt, dass das Doppelte verwendet werden soll. Float schneidet einige Dezimalstellen ab, wodurch die Genauigkeit verringert wird.
Kommentare
- Diese Antwort ‚ fügt der Frage nichts Neues hinzu und sagt nichts über die tatsächliche Verwendung aus.
Antwort
Normalerweise verwende ich den Typ float
, wenn Ich brauche nicht viel Präzision – zum Beispiel für Geld – was falsch ist, aber ich bin es gewohnt, falsch zu handeln.
Andererseits verwende ich wenn ich mehr Präzision benötige, zum Beispiel für komplexe mathematische Algorithmen.
Der C99-Standard sagt dies:
Es gibt drei Gleitkommatypen: float, double und long double. Der Typ double bietet mindestens so viel Präzision wie float, und der Typ long double bietet 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.
Ich habe , aber ich verwende C / C ++ nicht so oft. Normalerweise verwende ich dynamisch typisierte Sprachen wie Python, bei denen Sie sich nicht um die Typen kümmern müssen.
Weitere Informationen zu Double vs Float finden Sie unter dieser Frage bei SO .
Kommentare
- Die Verwendung von Gleitkommazahlen für ernsthafte Geldberechnungen ist wahrscheinlich ein Fehler.
- float ist genau der falsche Typ für Geld. Sie müssen die höchstmögliche Genauigkeit verwenden.
- @BartvanIngenSchenau Gleitkomma für Geld ist normalerweise in Ordnung, binäres Gleitkomma nicht. Beispiel: .net ‚ s
Decimal
ist ein Gleitkommatyp und ‚ ist typisch Eine gute Wahl für Geldberechnungen. - @ChrisF Sie benötigen ‚ keine “ hochpräzise “ Für Geld benötigen Sie genaue Werte.
- @SeanMcSomething – Fairer Punkt. Gleitkommazahlen sind jedoch immer noch der falsche Typ. Angesichts der in den meisten Sprachen verfügbaren Gleitkommatypen benötigen Sie “ hochpräzise „, um “ genaue Werte „.