Frage

type Gleitpunkt für eine Zahl von seiner signifikanten Stelle zu speichern und seine Exponenten getrennt auf separate Binärwörter so paßt es in 16, 32, 64 oder 128 Bit.

Festkommatyp speichert Zahlen mit 2 Worten, man den ganzzahligen Teil darstellt, eine andere, die den Teil hinter dem Radix, in negativen Exponenten, 2 ^ 1, ^ 2 -2, 2 -3 ^, etc.

Float sind besser, weil sie in einem Exponenten Sinne größeren Bereich haben, aber nicht, wenn man will Filialnummer mit mehr Präzision für einen bestimmten Bereich, beispielsweise nur ganze Zahl mit von -16 bis 16, also mehr Bits zu halten, Ziffern vorbei an der Radix.

In Bezug auf die Leistungen, die man die beste Leistung, oder gibt es Fälle, in denen einige schneller als die anderen?

In Videospiel-Programmierung, hat jeden Einsatz Gleitkomma weil die FPU es schneller macht, oder weil der Leistungsabfall nur vernachlässigbar ist, oder hat sie ihre eigene feste Art machen?

Warum ist es eine feste Art in C / C ++?

War es hilfreich?

Lösung

Diese Definition umfasst eine sehr begrenzte Teilmenge von festen Punkt-Implementierungen.

Es wäre richtiger zu sagen, dass nur in festen Punkt die Mantisse gespeichert ist und der Exponent ist eine Konstante a-priori bestimmt. Es besteht keine Notwendigkeit für den binären Punkt innerhalb der Mantisse zu fallen, und auf jeden Fall nicht erforderlich, dass sie an einer Wortgrenze fallen. Zum Beispiel sind alle der folgenden sind „Fixpunkt“:

  • 64 Bit Mantisse, skaliert von 2 -32 (dies entspricht der Definition in der Frage aufgeführt)
  • 64 Bit-Mantisse, skaliert durch 2 -33
  • (jetzt die Ganzzahl- und Bruchteile nicht durch eine Grenze getrennt werden Oktett)
  • 32 Bit Mantisse, skaliert von 2 4 (jetzt gibt es keinen Bruchteil)
  • 32 Bit Mantisse, skaliert von 2 -40 (jetzt gibt es keine ganzzahlige Teil)

GPUs neigen festen Punkt ohne ganzzahligen Teil zu verwenden (in der Regel 32-Bit-Mantisse skaliert durch 2 -32 ). Daher APIs wie OpenGL und Direct3D verwenden oft Gleitkommatypen die diese Werte zu halten, fähig sind. Um jedoch das ganzzahligen Mantisse Manipulieren ist oft effizienter, so dass diese APIs Spezifizierungs Koordinaten ermöglichen (im Texturraum, Farbraum, usw.) auf diese Weise auch.

Wie für Ihre Behauptung, dass C ++ keinen festen Punkt-Typ hat, bin ich anderer Meinung. Alle Integer-Typen in C ++ sind Punkttypen festgelegt. Der Exponent wird oft angenommen, Null zu sein, aber dies ist nicht erforderlich, und ich habe ziemlich viel von Festkomma-DSP-Code in C ++ implementiert diese Weise.

Andere Tipps

In der Codeebene, Festkommaarithmetik ist einfach Integer-Arithmetik mit einem impliziten Nenner.

Für viele einfache arithmetische Operationen, Festpunkt und Integer-Operationen sind im Wesentlichen gleich. Allerdings gibt es einige Operationen, die die Zwischenwerte müssen mit einer höheren Anzahl von Bits und dann abgerundet dargestellt werden. Um beispielsweise zu multiplizieren zwei 16-Bit-Festkommazahlen, muss das Ergebnis vorübergehend in einem 32-Bit gespeichert werden, bevor Renormalisierungstaktsignal (oder Sättigen) zurück zu dem 16-Bit-Festkomma.

Wenn die Software nicht nutzen Vektorisierung nimmt (wie CPU-basierte SIMD oder GPGPU), integer und Festpunkt arithmeric ist schneller als FPU. Wenn Vektorisierung verwendet wird, zählt die Effizienz der Vektorisierung viel mehr, so dass der Leistungsunterschiede zwischen Festpunkt und Fließkomma strittig ist.

Einige Architekturen bieten Hardware-Implementierungen für bestimmte mathematische Funktionen, wie sin, cos, atan, sqrt, für Gleitkommatypen nur. Einige Architekturen bieten keine Hardware-Implementierung überhaupt. In beiden Fällen spezialisierten mathematische Software-Bibliotheken nur ganzzahlige diese Funktionen bereitstellen können durch die Verwendung oder Festkommaarithmetik. Oft werden solche Bibliotheken mehrere Präzisionsgrade bieten, zum Beispiel Antworten, die auf N-Bit Genauigkeit nur genau bis sind, was weniger ist als die volle Genauigkeit der Darstellung. Die Begrenzt Präzision Versionen schneller sein als die höchsten präzise Version.

Festpunkt wird in DSP weit verbreitet und Embedded-Systemen, bei denen oft der Zielprozessor hat keine FPU und festen Punkt umgesetzt werden kann einigermaßen effizient eine ganze Zahl ALU verwendet wird.

In Bezug auf Leistung, die in Abhängigkeit von der Zielarchitektur und Anwendung likley unterschiedlich hoch sein kann. Natürlich, wenn es keine FPU ist, dann Fixpunkt wird wesentlich schneller sein. Wenn Sie eine FPU haben wird es auch von der Anwendung ab. Zum Beispiel einige Funktionen wie sqrt Ausführen () oder log () wird viel schneller sein, wenn sie direkt in dem Befehlssatz unterstützt eher thna algorithmisch umgesetzt werden.

Es gibt keine eingebauten festen Punkttyp in C oder C ++ Ich stelle ich vor, weil sie (oder zumindest C) als Systemsprachen ins Auge gefasst wurden und die Notwendigkeit Fixpunkt ist etwas domänenspezifische, und vielleicht auch, weil auf einem Mehrzweck Prozessor gibt es typischerweise keine direkte Hardware-Unterstützung für Festpunkt.

In C ++, die eine Festkommadatentypklasse mit geeigneten Betreibern Überlastungen und zugehörigen mathematischen Funktionen leicht dieses shortcomming überwinden kann. Allerdings gibt es gute und schlechte Lösungen für dieses Problem. A gut Beispiel finden Sie hier: http://www.drdobbs.com / CPP / 207000448 . Der Link zum Code in diesem Artikel ist gebrochen, aber ich verfolgen es auf ftp: / /66.77.27.238/sourcecode/ddj/2008/0804.zip

Die diferrence zwischen Gleitkomma- und Integer-Operationen hängt von der CPU Sie im Kopf hat. Auf Intel-Chip ist der Unterschied in clockticks nicht groß. Int Mathematik ist noch schneller, weil es mehrere Integer-ALUs das kann arbeiten parallel sind. Compiler ist auch intelligente spezielle Adresse Berechnungsanweisungen zu optimieren Add verwenden / mehrfach in einem einzigen Befehl. Conversion zählt als eine Operation zu, so dass nur Ihre Art wählen und bleiben Sie dabei.

In C ++ können Sie Ihre eigene Art für Festkommaberechnungen bauen. Sie definieren nur als Struktur mit einem int und die entsprechenden Überlastungen außer Kraft setzen, und sie tun, was sie normalerweise dazu Verschiebung tun das Komma wieder in die richtige Position zu bringen.

Sie müssen vorsichtig sein, wenn in diesem Zusammenhang „Präzision“ zu diskutieren.

Für die gleiche Anzahl von Bits in Darstellung des maximale Festpunkt Wert mehr Bits als jeder Fließkommawert (weil das Gleitkomma-Format hat einige Bits weg zu den Exponenten geben), aber der minimale Fixpunkt Wert weniger als jede nicht-denormalized Gleitkommawert (weil die festen Punktwert Abfälle den größten Teil seiner Mantisse in führenden Nullen).

auch in Abhängigkeit von der Art und Weisen Sie die Festpunktzahl aufteilen, kann der Fließkommawert der Lage sein, zu repräsentieren kleine Zahlen bedeuten, dass es eine genauere Darstellung der „kleine, aber nicht Null“ hat .

Und so weiter.

Sie verwenden nicht Schwimmer in den Spielen, weil es schneller oder langsamer Sie es verwenden, weil es einfacher ist, die Algorithmen zu implementieren, in Gleitkomma als in festen Punkt. Sie gehen davon aus, den Grund mit Rechengeschwindigkeit zu tun hat, und das ist nicht der Grund, hat es mit Leichtigkeit der Programmierung zu tun.

Zum Beispiel können Sie die Breite des Bildschirms / Ansichtsfenster wie gehen von 0,0 bis 1,0, wobei die Höhe des Bildschirms 0,0 bis 1,0 definieren. Die Tiefe des Wortes 0,0 bis 1,0. und so weiter. Matrix Mathematik, etc macht die Dinge wirklich einfach zu implementieren. Haben alle die Mathematik auf diese Weise bis zu dem Punkt, wo Sie echte Pixel auf einer reale Bildschirmgröße berechnen müssen, 800x400 sagen. Projizieren Sie den Strahl aus dem Auge zu dem Punkt auf dem Objekt in der Welt und berechnet, wo sie den Bildschirm durchbohren, von 0 bis 1 Mathematik verwenden, dann multiplizieren x von 800, y mal 400 und Ort dieses Pixel.

Gleitkommazahl speichert nicht den Exponenten und Mantisse getrennt und die Mantisse sind eine goofy Nummer, was nach dem Exponenten übrig und Zeichen, wie 23 Bits, nicht 16 oder 32 oder 64 Bits.

Gleitkommamathematik in seinem Kern Anwendungen Fixpunkt Logik mit zusätzlicher Logik und zusätzlichen Schritten erforderlich. Per Definition im Vergleich Äpfel mit Äpfeln Fixpunkt math ist billiger, weil Sie müssen die Daten auf dem Weg in die Alu manipulieren dont und müssen nicht die Daten auf dem Weg nach draußen (normalisieren) manipulieren. Wenn Sie in IEEE und all seinen Müll hinzufügen, die noch mehr Logik, mehr Taktzyklen etc. ergänzt (richtig signiert Unendlichkeit, ruhig und Signal nans, unterschiedliche Ergebnisse für dieselbe Operation, wenn es ein Exception-Handler aktiviert ist). Als jemand in einem realen System in einem Kommentar darauf hingewiesen, in dem Sie festgelegt haben und Schwimmer parallel, können Sie die Vorteile von einigen oder allen der Prozessoren zu nehmen und einige Takte auf diese Weise erholen. Mit diesen Arten von Tricks sowie Parallelbetrieb sowohl mit Schwimmer und fester Taktrate kann durch die Verwendung große Mengen von Chip-Immobilien erhöht werden, festgelegt wird billiger bleiben, aber Schwimmer kann feste Geschwindigkeiten nähern.

Ein Problem, nicht abgedeckt ist die Antwort ist ein Stromverbrauch. Obwohl es auf spezifische Hardware-Architektur stark abhängig ist, in der Regel FPU verbraucht viel mehr Energie als ALU in CPU so, wenn Sie mobile Anwendungen zielen, wo Stromverbrauch wichtig es ist, lohnt Fixpunkt impelementation des Algorithmus in Betracht ziehen.

Es hängt davon ab, was Sie gerade arbeiten. Wenn Sie Punkt fixiert sind verwenden, dann verliert man Präzision; Sie haben die Anzahl der Stellen nach dem Komma wählen (die nicht immer gut genug sein können). In Punkt schwebenden Sie nicht zu kümmern brauchen als die gebotene Präzision fast immer gut genug für die Aufgabe in der Hand ist - verwenden eine Standard-Formular Implementierung die Zahl darzustellen

.

Die Vor- und Nachteile kommen auf Geschwindigkeit nach unten und Ressourcen. Auf moderne 32bit und 64bit-Plattformen gibt es wirklich keine Notwendigkeit festen Punkt zu verwenden. Die meisten Systeme kommen mit in FPU gebaut, die für Festkommaoperationen optimiert sind fest verdrahtet werden. Darüber hinaus kommen die meisten modernen CPU-Spezifika mit Operationen wie das SIMD-Set über Vektorisierung, die dazu beitragen optimize Vektor-basierte Methoden und Abrollen. Also nur Fixpunkt kommt mit einer Seite nach unten.

Auf Embedded-Systeme und kleine Mikrocontroller (8bit und 16bit) Sie können keine FPU noch erweiterte Befehlssätze haben. In diesem Fall können Sie Festpunktverfahren oder die begrenzten Gleitkomma-Befehlssätze zu verwenden, gezwungen werden, die nicht sehr schnell ist. So unter diesen Umständen festen Punkt wird eine bessere sein - oder sogar die einzige -. Wahl

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