Frage

Was sind die Vor- und Nachteile eines anstelle des anderen in C ++ verwenden?

War es hilfreich?

Lösung

Wenn Sie die richtige Antwort wissen wollen, sollten Sie eine href lesen <= „http://download.oracle.com/docs/cd/E19422-01/819-3693/ncg_goldberg.html“ rel = "noreferrer „> Was jeder Informatiker wissen sollten über Gleitkommaarithmetik .

Kurz gesagt, obwohl double für höhere Genauigkeit ermöglicht in seiner Darstellung, für bestimmte Berechnungen es produzieren würde größere Fehler . Die „richtige“ Wahl ist. so viel Präzision verwenden, wie Sie brauchen aber nicht mehr und Wählen Sie den richtigen Algorithmus

Viele Compiler in „non-strict“ Modus ohnehin Gleitkomma-Mathematik erweitert (das heißt eine breiteren Gleitkommatyps in Hardware zur Verfügung verwenden, zum Beispiel 80-Bit und 128-Bit-Floating), dies sollte auch berücksichtigt werden. In der Praxis können Sie sehen kaum einen Unterschied in der Geschwindigkeit - sie sind Eingeborene Hardware sowieso

.

Andere Tipps

Wenn Sie einen bestimmten Grund haben es anders zu machen, verwenden Sie verdoppeln.

Vielleicht überraschend, es ist doppelt und schwebt nicht, dass die „normale“ ist Gleitkommatyp in C (und C ++). Die Standard-mathematische Funktionen wie sin und log nehmen verdoppelt sich als Argumente und Rück verdoppelt. Ein normaler Fließkomma wörtlichen, wie wenn Sie auf 3,14 in Ihrem Programm zu schreiben, hat den Typ double. Nicht schwimmen.

Auf typische modernen Computern können Doppel nur als Schwimmer so schnell oder sogar schneller, so dass Leistung ist in der Regel nicht ein zu berücksichtigender Faktor, auch für große Berechnungen. (Und die wäre müssen groß Berechnungen oder Leistung sollte nicht einmal geben Sie Ihren Geist. Meine neue i7 Desktop-Computer sechs Milliarden Multiplikationen von Doppel in einer Sekunde tun.)

Diese Frage ist nicht zu beantworten, da es kein Zusammenhang auf die Frage ist. Hier sind einige Dinge, die die Wahl beeinflussen können:

  1. Compiler Implementierung von Schwimmern, Doppel- und langen Doppelzimmern. Die C ++ Standard besagt:

      

    Es gibt drei Gleitkomma-Typen: float, double und long double. Die Art Doppel bietet mindestens so viel Präzision wie Schwimmer und dem Typ long double liefert mindestens so viel Präzision wie double.

    Also, alle drei können die gleiche Größe in Erinnerung sein.

  2. Vorhandensein einer FPU. Nicht alle CPUs haben FPU und manchmal ist der Floating-Point-Typ emuliert werden und manchmal auch die Gleitkomma-Typen sind nur nicht unterstützt.

  3. FPU Architektur. Die IA32 der FPU ist intern 80bit - 32-Bit und 64-Bit-floats erweitert werden auf Last und reduziert auf Speicher 80bit. Es gibt auch SIMD die vier 32-Bit-Schwimmern oder zwei 64-Bit-Schwimmer parallel tun. Die Verwendung von SIMD ist nicht im Standard definiert, so würde es einen Compiler erfordern, die komplexere Analyse tut, um festzustellen, ob SIMD verwendet werden kann, oder erfordert die Verwendung von Sonderfunktionen (Bibliotheken oder intrinsics). Das Ergebnis des 80bit interne Format ist, dass man leicht unterschiedliche Ergebnisse können je nachdem, wie oft die Daten gespeichert werden in den RAM (also verlieren Präzision). Aus diesem Grunde Compiler nicht optimiert Punktcode Floating besonders gut.

  4. Speicherbandbreite. Wenn ein Doppel mehr Speicherplatz als ein Schwimmer benötigt, dann wird es länger dauern, die Daten zu lesen. Das ist die naive Antwort. Auf einem modernen IA32, es hängt alles davon ab, wo die Daten kommen. Wenn es in der L1-Cache ist, wird die Last vernachlässigbar die Daten zur Verfügung gestellt von einer einzigen Cache-Zeile kommt. Wenn es mehr als eine Cache-Zeile überspannt es gibt einen kleinen Overhead. Wenn es von L2 ist, dauert es eine Weile länger, wenn es in RAM ist, dann ist es noch länger und schließlich, wenn es auf der Festplatte ist es eine große Zeit. Deshalb ist die Wahl des Schwimmers oder doppelt so hoch ist weniger wichtig als die Art und Weise der Daten verwendet werden. Wenn Sie eine kleine Berechnung auf vielen sequentiellen Daten tun wollen, ein kleinen Datentyp bevorzugt. erlauben würde, auf einem kleinen Datensatz viele Rechen tun Sie größere Datentypen mit einem signifikanten Effekt zu nutzen. Wenn Sie die Daten zugreifst sehr zufällig, dann die Wahl der Datengröße ist unwichtig - Daten werden in Seiten / Cache-Zeilen geladen. Also selbst wenn Sie nur ein Byte aus dem RAM möchten, können Sie 32 Bytes erhalten übertragen (dies ist sehr abhängig von der Architektur des Systems). Hinzu kommt all dies könnte die CPU / FPU superskalare (aka Pipeline-) sein. Also, auch wenn eine Last mehr Zyklen in Anspruch nehmen, die CPU / FPU könnte beschäftigt sein, etwas anderes zu tun (eine Multiplikation zum Beispiel), die die Ladezeit bis zu einem Grad versteckt.

  5. Der Standard erzwingt kein bestimmtes Format für Gleitkommazahlen.

Wenn Sie eine Spezifikation haben, dann werden, dass Sie die optimale Wahl führen. Ansonsten ist es nach unten zu erfahren, was zu verwenden.

Double ist präziser, sondern auf 8 Byte codiert. Schwimmer ist nur 4 Bytes, also weniger Raum und weniger Präzision.

Sie sollten sehr vorsichtig sein, wenn Sie doppelt und Schwimmer in Ihrer Anwendung haben. Ich hatte einen Fehler aufgrund der in der Vergangenheit. Ein Teil des Codes war Kelle, während der Rest des Codes Doppel wurde mit. Kopieren Doppel zu schweben und dann schweben zu verdoppeln Präzision Fehler verursachen, die eine große Wirkung haben können. In meinem Fall war es eine chemische Fabrik ... hoffentlich hat es nicht dramatische Folgen haben:)

Ich denke, dass es wegen dieser Art von Fehler ist, dass die Ariane 6 Rakete vor einigen Jahren explodiert !!!

Denken Sie sorgfältig über den Typ einer Variablen verwendet werden

Ich gehe persönlich für Doppel der ganzen Zeit, bis ich einige Engpässe zu sehen. Dann in Erwägung ziehen ich einige andere Teil zu schwimmen oder zu optimieren

Das hängt davon ab, wie die Compiler implementiert verdoppeln. Es ist legal für Doppel und schwebt die gleiche Art zu sein (und es ist auf einigen Systemen).

Dass gesagt wird, wenn sie in der Tat unterschiedlich sind, ist das Hauptproblem Präzision. Ein Doppel hat eine viel höhere Genauigkeit aufgrund seines Unterschiedes in der Größe. Wenn die Zahlen, die Sie häufig verwenden, wird der Wert eines Schwimmers überschreiten, dann ein Doppel verwenden.

Mehrere andere Menschen haben Leistung isssues erwähnt. Das wäre genau das letzte auf meiner Liste der Überlegungen. Correctness sollte Ihr # 1 zu berücksichtigen ist.

Verwenden je nachdem, welche Präzision erforderlich, um die entsprechenden Ergebnisse zu erreichen. Wenn Sie dann feststellen, dass Ihr Code nicht so gut, wie Sie möchten ausführt (Sie verwendet korrekte Profilierung?) Zu sehen:

Ich denke, unabhängig von den Differenzen (die wie alle darlegt, schwebt weniger Platz in Anspruch nehmen und sind in der Regel schneller) ... hat jemand jemals Performance-Problemen leiden mit doppelseitigem? Ich sage mit doppelseitiger ... und wenn Sie später entscheiden „Wow, das ist wirklich langsam“ ... Ihre Performance-Engpass finden (was wahrscheinlich ist nicht die Tatsache, dass Sie doppelt verwendet wird). DANN, wenn es für Sie immer noch zu langsam ist, sehen, wo man einige Präzision opfern und Schwimmer verwenden.

Der Hauptunterschied zwischen Schwimmer und doppelt so hoch ist Präzision. Wikipedia hat weitere Informationen über einfacher Genauigkeit (float) und doppelte Genauigkeit .

Es hängt stark von der CPU die offensichtlichsten Kompromisse zwischen Genauigkeit und Speicher sind. Mit GBs RAM, ist ein Speicher eines Problems nicht viel, so ist es im Allgemeinen besser doubles zu verwenden.

Was die Leistung, es hängt stark von der CPU. floats wird in der Regel eine bessere Leistung als doubles auf einem 32-Bit-Maschine. Auf 64-Bit, doubles sind manchmal schneller, da es (in der Regel) die native Größe ist. Doch was wird viel mehr als die Wahl von Datentypen aus, ob oder nicht Sie die Vorteile von SIMD-Befehle auf dem Prozessor nehmen.

Doppel hat eine höhere Genauigkeit, während Schwimmer weniger Speicher benötigen und sind schneller. Im Allgemeinen sollten Sie Schwimmer verwenden, wenn Sie einen Fall, wo es nicht genau genug ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top