Frage

Vor Jahren habe ich gelernt, auf die harte Weise über Präzision Probleme mit Schwimmern so gab ich sie. Aber ich laufe in Code noch Floats mit und es mich machen erschaudern, weil ich einige der Berechnungen wissen wird ungenau.

Also, wann ist es angebracht, einen Schwimmer zu benutzen?

EDIT: Als Info, glaube ich nicht, dass ich über ein Programm gekommen sind, wo die Genauigkeit einer Zahl ist nicht wichtig. Aber ich würde hören Beispiele interessiert sein.

War es hilfreich?

Lösung

Kurze Antwort:. Sie nur zu benutzen, haben eine float , wenn Sie genau wissen, was Sie tun und warum

Lange Antwort: schwimmt (im Gegensatz zu verdoppelt ) ist wirklich nicht mehr außerhalb 3D-APIs verwendet, soweit ich weiß. Floats und doubles haben die gleichen Leistungsmerkmale auf modernen CPUs, Doppelzimmer etwas größer und das ist alles. Im Zweifelsfall einfach doppelt verwendet werden.

Oh ja, und verwenden Sie dezimal für finanzielle Berechnungen, natürlich.

Andere Tipps

Alle Fließkommaberechnungen sind inaccurature in einem allgemeinen Fall schwebt nur um so mehr als verdoppelt. Wenn Sie weitere Informationen wünschen eine Lese von Was jeder Informatiker wissen sollten über Gleitkommaarithmetik

Was, wenn Schwimmer verwenden - sie häufig verwendet werden, wenn Genauigkeit weniger wichtig ist als Speicher zu speichern. Zum Beispiel einfache Partikelsimulationen in Videospielen.

Zuerst nie verwenden Schwimmern oder verdoppelt, wenn Sie genau Dezimalzahlen darstellen wollen - entweder Integer-Typen verwenden (int, long usw.) oder dezimal (die mit einem Skalierungsfaktor nur ein Integer-Typ ist). Floats und verdoppelt sind intern mit einer exponentiellen Darstellung in der Basis 2 und Zahlen dargestellt genau in einer exponentiellen Darstellung in der Basis 10 kann im allgemeinen nicht genau dargestellt werden, umgewandelt. (Zum Beispiel die Zahl 10 ist nur repräsentiert etwa durch Schwimmer oder verdoppelt).

Zweitens hinsichtlich Präzision es hängt davon ab, was Sie brauchen. Ich bin nicht mit Ihrem Gefühl einig, dass es nie Berechnungen, bei denen Genauigkeit keine Rolle spielt. Sie haben in der Regel einen besonderen Bedarf, die Ihr Endergebnis genau zu sagen, 3-stellig. Es macht keinen Sinn für höchste Präzision suchen möglich, wenn Sie Ihre Eingabe nur eine begrenzte Genauigkeit hat - sagen Sie einige 5 g Mehl wiegen und Ihre Waage hat nur eine Genauigkeit bis 0,5 g. Das heißt, Zwischenberechnung in der Regel von höherer Präzision profitieren, sondern etwas, das wichtiger als eine hohe Präzision, wenn sehr oft beschleunigen.

Drittens, wenn eine Reihe von Berechnungen Vorformen, sagen wir innerhalb einer Schleife, müssen Sie wissen, was Sie tun, wenn sie mit irgendwelchen ungenauen Berechnungen zu tun - Sie werden Rundungsfehler entstehen und einige Algorithmen nicht auf einer Antwort auf eine ankommen Grad an Präzision. diese Fragen im Detail zu verstehen, kann einen Kurs in der numerischen Analyse erfordern. Dies ist unabhängig davon, ob Sie sich für Schwimmer oder Doppel für Ihre Berechnungen.

Für Gleitkomma-Berechnungen würde ich in der Regel mit Doppel gehen, da sie allgemeiner und schneller als Schwimmer sind. Allerdings Schwimmer ist kleiner, und wenn Sie eine Menge von ihnen speichern müssen, sind sie die Wahl Leistungsproblem zu verhindern, aufgrund von Cache-Misses.

Mein Wissen Floating-Point-Verarbeitung wird für Doppel in Hardware unterstützt, aber nicht schwimmt, so Floats mit verursacht eine Umwandlung zu verdoppeln. Doch einige Routinen früher aufhören würde, wenn ein Wert iterativ berechnet wird, wenn Sie einen Schwimmer passieren, da dies bedeutet, dass Sie nur etwa 8 Ziffern Präzision wollen gegenüber etwa 16 für Doppelzimmer.

Es gibt viele Fälle, die Sie wollen, würde eine float verwenden. Was ich aber nicht verstehe, ist, was Sie stattdessen verwenden können. Wenn Sie statt double mit float bedeuten, dann ja, in den meisten Fällen wollen Sie das tun. Allerdings double auch Präzision Probleme haben. Sie sollten decimal verwenden, wenn die Genauigkeit wichtig ist.

float und double sind sehr nützlich in vielen Anwendungen. decimal ist ein teurer Datentyp und seine Reichweite (die Größe der größten Zahl es darstellen kann) kleiner als double. Computer haben in der Regel eine spezielle Hardware-Level-Support für die Datentypen. Sie werden verwendet, viel in wissenschaftlichem Rechnen. Im Grunde sind sie primäre Fraktionen von Datentypen, die Sie verwenden möchten. Doch in monetären Berechnungen, bei denen Präzision extrem wichtig ist, decimal ist der Weg zu gehen.

Der häufigste Grund, warum ich denken konnte, ist Platz zu sparend. Nicht, dass dies oft die Mühe wert, aber in einigen Fällen ist es von Bedeutung ist. Ein Schwimmer nimmt halb so viel Speicher wie ein Doppelzimmer, so dass Sie doppelt so viele im gleichen Raum zu bekommen. Zum Beispiel habe ich eine Reihe von Zahlen habe, die zu groß war in dem RAM als Doppel zu passen aber fit wie ein Array schwimmt.

Es gibt in der Tat eine Sache, wo es immer noch üblich ist Schwimmer zu verwenden aka "Single precision" mit 32 Bit. Grafische Anwendungen und Druck

Der andere Grund sind Grafikkarten mit ihrem GPUs. Je kleiner der Datentyp ist, desto schneller der Betrieb, da weniger Bits müssen transportiert werden. Integer-Datentypen haben Probleme mit High Dynamic Range Images: Das Auge ist in der Lage über einen Helligkeitsbereich funktionieren von 1: 10 ^ 13 und erkennt ca. 4000 Stufen. Während also integer Datentypen die Anzahl der Ebenen speichern können sie nicht in der Lage, die Hintergrundhelligkeit zu speichern, während Schwimmern keine Probleme damit haben. In der Tat ermöglicht IEEE 754r einen neuen „Halb precision“ Schwimmer mit 16 Bits und einen 10-Bit Mantisse, die eine gewisse Präzision verliert würde, aber erlauben eine noch größere Geschwindigkeit. OpenGL und DirectX z.B. Verwendung schwimmt ausgiebig. Das Auge ist sehr nachsichtig mit Artefakten, also kein Problem da.

Alle anderen Medien Gebäude auf Grafiken Schwimmern als convienient Maß erben. Die Mantisse hat 24 Bits, so dass daher 2 ^ 24 = 16,7 Millionen aufeinanderfolgenden Schritten. Wenn Sie einen Drucker mit 2000 dpi Auflösung haben, sind Sie noch in der Lage 213x213 m drucken Blätter. Mehr als genug, um Präzision.

Mit Schwimmer für Leistung und Größe . Wenn Sie den Genauigkeitsverlust verwalten.

Es stimmt zwar, dass ein moderner Prozessor die gleiche Menge an Zeit in Anspruch nimmt einfacher und doppelter Genauigkeit opertions zu verarbeiten, können Sie manchmal bekommen zweimal der Durchsatz, wenn Sie schwimmt mit SIMD verwenden (MMX / SSE / usw. auf x86) Anweisungen.

SSE-Register sind 128 Bit breit und halten können 4 Schwimmern oder 2 Doppelzimmer . So wenn richtig eingesetzt, können Sie doppelt so viele Operationen mit Schwimmern tun im Vergleich zu Doppelzimmern.

Die Größenreduktion (4 Bytes statt 8) wird wichtig, wenn mit sehr großen Datenmengen zu tun (und Größenreduzierung in der Regel verbessert die Leistung als auch durch Caching, etc.)

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