22

Für intensives Zahlen-Knirschen erwäge ich, Fixpunkte statt Gleitkommazahlen zu verwenden. Natürlich ist es egal, wie viele Bytes der Fixpunkttyp in der Größe ist, auf welcher CPU er läuft, ob ich (für Intel) MMX oder SSE verwenden kann oder was auch immer neue Dinge kommen ...Wann verwende ich Fixed Point?

Ich frage mich, ob in diesen Tagen, wenn Fließkomma schneller läuft als je zuvor, ist es jemals wert, Fixpunkt zu betrachten? Gibt es allgemeine Faustregeln, in denen wir sagen können, dass es um mehr als ein paar Prozent geht? Was ist der Überblick von 35.000 Fuß numerischer Leistung? (BTW nehme ich eine allgemeine CPU an, wie in den meisten Computern, nicht DSP oder spezialisierte eingebettete Systeme.)

Antwort

18

Es ist immer noch wert. Gleitkomma ist schneller als in der Vergangenheit, aber auch Fixpunkt. Und Fixed ist immer noch der einzige Weg zu gehen, wenn Sie Präzision über die von IEEE 754 garantiert.

+2

+1, haben Sie eine Benchmark-Software, die Sie verwenden, um dies für verschiedene Architekturen zu überprüfen. Ich kam durch Profiling zu demselben Ergebnis, aber es war ein gutes Stück Arbeit und die Ergebnisse beziehen sich nur auf die spezifische Hardware, die ich getestet habe. Sie interessieren sich für den Unterschied auf mobilen Geräten mit ARM sowie den häufiger verwendeten Intel und AMD. –

0

Da Sie eine Mehrzweck-CPU verwenden, würde ich vorschlagen, nicht Fixpunkt, es sei denn Leistung ist so wichtig für Ihre Anwendung, dass Sie jeden Tick zählen müssen. Der Aufwand, einen Fixpunkt zu implementieren und sich mit Problemen wie Überlauf zu beschäftigen, ist es einfach nicht wert, wenn Sie eine CPU haben, die das für Sie erledigt.

IMHO, Fixpunkt ist nur notwendig, wenn Sie einen DSP ohne Hardware-Unterstützung für Fließkommaoperationen verwenden.

11

Ein weiterer guter Grund, feste Dezimalstellen zu verwenden, ist, dass das Runden viel einfacher und vorhersagbarer ist. Die meisten der Finanzsoftware verwenden Festkomma-Dezimalzahlen mit beliebiger Genauigkeit und halbgerundeter Rundung, um Geld darzustellen.

+0

mein Interesse war nicht finanziell, aber das ist ein guter Punkt – DarenW

+0

Sehr wahr. Dies gilt auch für die Implementierung einer deterministischen verteilten Echtzeitsimulation. Geringfügige Unterschiede in IEEE-754-Implementierungen können dazu führen, dass Fehler nur sehr schwer zu finden sind, wenn die gleiche Berechnung auf verschiedenen verteilten Systemen zu unterschiedlichen Ergebnissen führt, wodurch sie vom erwarteten Simulationszustand abweichen. Siehe [diesen Artikel] (http://gafferongames.com/networking-for-game-programmers/floating-point-determinism/). –

4

Verwenden Sie einen Fixpunkt, wenn die Hardware Gleitkomma nicht unterstützt oder die Hardware-Implementierung saugt.

Passen Sie auch auf, wenn Sie Klassen dafür machen. Etwas, von dem Sie denken, es würde schnell gehen, könnte sich tatsächlich als ein Hund herausstellen, wenn es darum geht, ein Profil zu erstellen, das auf (un) notwendigen Kopien von Klassen beruht. Das ist eine andere Frage für eine andere Zeit.

+0

Es wäre interessant zu wissen, welche Hardware Gleitkommazahlen heutzutage nicht unterstützt. Es scheint, dass jetzt, auch eine rattige alte gebrochene Schnürsenkel hat Gleitpunkt ... 8P – DarenW

+1

(übrigens trage ich Sandalen hier in Florida, so bin ich nicht auf Schnürsenkel Technologie) – DarenW

+2

@DarenW: Der Nintendo DS (die ich noch etwas überdenken) unterstützt Gleitkomma nicht über Hardware. Das ist das einzige Handheld-Gerät, für das ich entwickelt habe, aber ich nehme an, dass viele andere Handhelds auch keine FPU haben. – Ponkadoodle

5

Es ist fast immer schneller Fixpunkt zu verwenden (Erfahrung von x86, Pentium, 68k und ARM). Es kann jedoch auch vom Anwendungstyp abhängen. Für die Grafikprogrammierung (eine meiner Hauptverwendungen von Fixpunkten) war ich in der Lage, den Code mit vorgefertigten Kosinus-Tabellen, Log-Tabellen usw. zu optimieren. Aber auch die mathematischen Grundoperationen haben sich als schneller erwiesen.

Ein Kommentar zu Finanzsoftware. Es wurde in einer früheren Antwort gesagt, dass Fixpunkt für Finanzberechnungen nützlich ist. Aufgrund meiner eigenen Erfahrung (Entwicklung eines großen Treasury-Management-Systems und umfangreicher Erfahrung in der Kreditkartenverarbeitung) würde ich keinen Fixpunkt verwenden. Sie haben Rundungsfehler mit Gleit- oder Fixpunkt. Wir verwenden immer ganze Beträge, um Geldbeträge darzustellen, wobei wir den Mindestbetrag (1c für Euro oder Dollar) zählen. Dies stellt sicher, dass keine Teilbeträge verloren gehen. Bei komplexen Berechnungen werden die Werte in Doppelwerte konvertiert, anwendungsspezifische Rundungsregeln angewendet und die Ergebnisse in ganze Zahlen zurückgerechnet.

+0

In meinem Fall (Provisionsberechnung) verwenden wir Java BigDecimal, was nicht genau ein Fixpunkt ist, aber ziemlich nahe kommt. Die Rundungsregeln sind zwar anwendungsspezifisch, aber in 9 von 10 Fällen sind sie halbgleich. – ddimitrov

+0

Bei komplexen Berechnungen meinen Sie Zinseszinsen, Steuersätze oder ähnliches? Für das Addieren und Subtrahieren von Beträgen in einem Konto wäre nicht genau der One True Way festgelegt? Verwenden Sie in diesem Fall Floats? – DarenW

+1

Tabellensuche ist eine wichtige Überlegung in dem, was ich tue und was viele andere brauchen - das ist mit Fließkomma nicht praktisch. Ein sehr guter Punkt. – DarenW

17

In Situationen, in denen Sie mit sehr großen Datenmengen zu tun haben, kann der Fixpunkt doppelt so effizient sein, z. eine vier Byte lange Ganzzahl im Gegensatz zu einem Acht-Byte-Doppel. Eine Technik, die häufig in großen Geodatensätzen verwendet wird, besteht darin, alle Daten auf einen gemeinsamen Ursprung zu reduzieren, so dass die höchstwertigen Bits entsorgt werden können, und für den Rest mit Festkomma-Ganzzahlen zu arbeiten. Gleitkomma ist nur wichtig, wenn der Punkt tatsächlich schwebt, d. H. Sie haben einen sehr großen Zahlenbereich mit sehr hoher Genauigkeit.

+5

Toller Kommentar über den "schwebenden" Teil des Fließkomma - blies meinen Geist weit offen und so offensichtlich in retropect. – Curyous

1

Ein weiterer Grund Festpunkt zu verwenden ist, dass ARM Geräte, wie Mobiltelefone und Tabletten, Mangel an FPU (mindestens viele von ihnen).

Für die Entwicklung von Echtzeitanwendungen ist es sinnvoll, Funktionen mit Festkommaarithmetik zu optimieren. Es gibt Implementierungen von FFTs (Fast Fourier Transform), die sehr wichtig für Grafiken sind, die ihre Verbesserungen auf der Grundlage von Fließkomma-Arithmetik basieren.

+0

Ich denke, Ihr letzter Satz sollte "sich auf Festkommaarithmetik stützen". –