2009-12-08 4 views
6

Gibt es Situationen, in denen es sinnvoller wäre, einen einzelnen Datentyp anstelle eines Double zu verwenden? Aus meiner Suche besteht der Nachteil eines Double darin, dass es mehr Platz benötigt, was für die meisten Anwendungen kein Problem darstellt. Sollten in diesem Fall alle Gleitkommazahlen verdoppelt werden?Single vs Double-Datentypen

Ein wenig Hintergrundinfo: Ich arbeite mit einer Anwendung, die sich mit einer Menge Daten über Koordinaten und Chemikalien beschäftigt. Einige Kunden haben festgestellt, dass beim Importieren von Tabellenkalkulationen einige Werte mit hoher Genauigkeit auf die Genauigkeit eines einzelnen abgerundet werden.

+2

"Die meisten" Anwendungen. Könnte ein Problem für eingebettete Systeme sein, oder wenn Sie Millionen von Doppeln haben. – mpen

+1

Meine Faustregel ist, normal zu verwenden, float (scheinbar Ihre Single), wenn ich einen guten Grund habe (wie Platz zu sparen). –

Antwort

2

Auf den meisten Desktop-Anwendungen, ja.

Obwohl, wenn Sie eine riesige Reihe von ihnen haben, halbiert die Größe von dieser könnte signifikant genug sein, um sich zu lohnen, wenn Sie nicht die Präzision benötigen.

Vor allem, da so ziemlich alle Verbraucher-Desktops Gleitkommaarithmetik mit doppelter Genauigkeit in Hardware ausgeführt haben.

+0

Die ersten Nvidia CUDA-Karten verarbeiten mehr Floats mit einfacher Genauigkeit als doppelt pro Sekunde. Ich habe nicht die Zahlen im Kopf, sorry. –

+0

Hinweis: Die Intel- und AMD-Prozessoren in allgemeinen Desktops verfügen in den SSE-Registern ebenfalls über arithmetische Hardware mit einfacher Genauigkeit, die auch mehrere parallele Operationen unterstützt. – deegee

2

Wie Mark in seinem Kommentar sagt, kann Platz ein Problem bei Systemen mit eingeschränktem Speicher sein. Sie können auch eine Liste indizieren oder sortieren, und warum verdoppelt sich das, wenn Sie Ihre Werte in Singles speichern können?

4

Von this .net Artikel

Datentyp Breite

Die effizientesten Datentypen sind diejenigen, die die nativen Datenbreite der Laufzeitplattform nutzen. Auf aktuellen Plattformen ist die Datenbreite 32 Bit, sowohl für den Computer als auch das Betriebssystem .

Folglich ist Integer derzeit der effizienteste Datentyp in Visual Basic .NET. Nächstbeste sind Long, Short, und Byte, in dieser Reihenfolge der Effizienz. Sie können die Leistung von Short und Byte verbessern durch integer Überlaufprüfung ausgeschaltet, beispielsweise durch die RemoveIntegerChecks Einstellung Eigenschaft, aber dies verursacht das Risiko von falschen Berechnungen aufgrund unentdeckt überlaufen. Sie können nicht diese Überprüfung ein- und ausschalten während Laufzeit; Sie können nur den Wert für den nächsten Build Ihrer -Anwendung festlegen.

Wenn Sie gebrochene Werte benötigen, die beste Wahl ist doppelt, weil die Floating-Point-Prozessoren der aktuellen Plattformen alle Operationen in doppelter Genauigkeit durchzuführen. Nächstbeste sind Single und Decimal, in dieser Reihenfolge von Effizienz.

+1

Ist das Doppelte effizienter als das Einzelne? – Everett

+0

Ja, nach dem Artikel, aus Sicht der Operationen (d. H. Multiplizieren, Dividieren, etc ...) sollten Doppelgänger effizienter sein. Natürlich, wie viele andere darauf hingewiesen haben, ist Single aus Sicht der Speicherbenutzung besser. Was noch wichtiger ist, Sie erwähnen, dass die Kunden den Verlust an Präzision bemerkt haben, was bedeutet, dass sie eine höhere Präzision wünschen. Also, die Frage ist nicht, welche ist besser? Es ist, wo/warum werden meine Doubles zu Singles besetzt? –

1

Doppelt nehmen mehr Platz ein, aber die zusätzliche Genauigkeit kann erforderlich sein oder auch nicht. Ich habe viel in der wissenschaftlichen Welt programmiert, wo Fließkomma-Arithmetik sehr häufig ist, und festgestellt, dass man oft die Berechnungen in doppelter oder höherer Genauigkeit durchführen kann, aber die Ergebnisse als Singles ohne negative Auswirkungen speichert.

Denken Sie daran, dass die Nummern, sobald sie in die FPU gesaugt werden, trotzdem auf eine sehr hohe Genauigkeit erweitert werden.Vor diesem Hintergrund wäre es am besten, alles, was Sie tun, in beiden Genauigkeiten zu testen und zu sehen, ob die Ergebnisse vergleichbar sind.

Leider ist Computing noch eine experimentelle Wissenschaft.

+0

Grenzen sind (mit Schwierigkeit) berechenbar für Gleitkommafehler, die sich aus der Auswertung eines gegebenen Ausdrucks in gegebener Genauigkeit ergeben. –

0

Wenn Sie OpenGL kodieren, dann ist es normal, GLSingle (zB single) anstatt GLDouble zu verwenden. In fast allen Fällen ist die einfache Genauigkeit mehr als genug für die meisten Grafikanwendungen und sollte schneller sein - obwohl ich gestehe, dass ich bei der neuesten Generation von GPUs davon nicht überzeugt bin.

Mein Lieblingszitat hierüber ist, dass die einfache Präzision ausreichte, um zum Mond und zurück zu navigieren, so dass es in der Praxis ungewöhnlich ist, ein echtes Problem zu verursachen. Das heißt, in den meisten Fällen würde ich heute nach einem Double greifen, da Speicher billig ist und es weniger wahrscheinlich ist, dass Binärdaten in Dezimalzahlen vorkommen.

2

Auf einer Hardware kann die Arithmetik mit Doppelwerten länger dauern als mit Einzelwerten, aber die neuesten FPUs haben einen einzigen nativen Datentyp (z. B. 80-Bit erweiterte Gleitkommawerte für x86), die intern für verwendet werden Berechnungen unabhängig davon, welchen In-Memory-Datentyp Sie verwenden. Das heißt also, dass "FPU-Berechnungen mit einfacher Genauigkeit schneller sein werden", ist im Allgemeinen kein ein Grund, Single-Precision heute auf modernster Hardware zu verwenden.

Abgesehen von den in den anderen Antworten erläuterten "weniger Speicher verwenden" -Gründen gibt es einen sehr praktischen Grund, wenn es um SIMD-Vektorbefehle wie SSE und AltiVec geht - einfache Genauigkeit ist doppelt so groß Schnell wie doppelte Genauigkeit, da die Befehle auf Vektoren mit fester Größe angewendet werden und Sie doppelt so viele Einzelpräzisionswerte in einen einzelnen Vektor eingeben können, wobei die Verarbeitungszeit typischerweise gleich bleibt. B. mit einer 128-Bit-Vektoreinheit, die Vektormultiplikationen in 2 Taktzyklen verarbeiten kann, einen Durchsatz von 2 Multiplikationen mit einfacher Genauigkeit pro Takt im Vergleich zu 1 Doppelpräzision erhalten, da Sie 4 Singles in einen Vektor einlesen können , gegen zwei Doppel.

Ein ähnlicher Effekt tritt bei der Speicherbandbreite auf und ist nicht spezifisch für Vektorverarbeitung - wenn Sie große Doppelfelder haben, nehmen sie nicht nur den doppelten Platz ein, sondern können bis zu doppelt so lange verarbeiten dass Ihr Algorithmus bandbreiteneingeschränkt ist (was angesichts der zunehmenden Größen und abnehmenden Latenzen von Vektorverarbeitungseinheiten zunehmend wahrscheinlich ist).

+0

und Referenzen: Was jeder Informatiker über Gleitkommaarithmetik wissen sollte - http://docs.sun.com/source/806-3568/ncg_goldberg.html Fließkomma (von der Programmierung in Java) - http: // www.cs.princeton.edu/introcs/91float/ – mctylr

+0

Beachten Sie, dass ich doppelt überprüft und AltiVec unterstützt eigentlich nur 32-Bit-Single-Precision-FP-Werte für SIMD, aber zumindest die verschiedenen SSE Aromen unterstützen definitiv beide. – BeeOnRope