Fixpunkt gegen Gleitkommazahl

109

Ich kann Festkomma- und Gleitkommazahlen einfach nicht verstehen, da die Definitionen in ganz Google schwer zu lesen sind. Aber keine, die ich gelesen habe, liefert eine hinreichend einfache Erklärung dafür, was sie wirklich sind. Kann ich eine einfache Definition mit Beispiel erhalten?

user942451
quelle
Ich habe auch Probleme, eine gute Definition zu finden. Die Hauptsache, nach der ich suche, hilft mir, diese Ergebnisse zu verstehen: 3,11 + 42,0 = 45,110001 (nicht 45,11), 3,12 + 42,0 = 45,119999 (nicht 45,12), 3,15 + 42,0 = 45,150002 (nicht 45,15).
Bart S.
1
Ich denke, dies ist eine relevante Diskussion (insbesondere die Beschreibung der Fallen mit schwebenden Zahlen und die bessere Präzision mit festem Punkt und warum Sie niemals Geld als Float beschreiben möchten
Andrew Norman
Zufälliger Link, in dem die Themen erwähnt werden "OpenGL® ES OpenGL ES enthält Profile für Gleitkomma- und Festkommasysteme und die EGL ™ -Spezifikation ..."
The Red Pea

Antworten:

145

Eine Festkommazahl hat eine bestimmte Anzahl von Bits (oder Ziffern), die für den ganzzahligen Teil (den Teil links vom Dezimalpunkt) reserviert sind, und eine bestimmte Anzahl von Bits, die für den Bruchteil reserviert sind (den Teil rechts von der Dezimalstelle) Punkt). Egal wie groß oder klein Ihre Anzahl ist, es wird immer die gleiche Anzahl von Bits für jeden Teil verwendet. Wenn Ihr Festkommaformat beispielsweise dezimal IIIII.FFFFFwäre, wäre die größte Zahl, die Sie darstellen könnten, 99999.99999und die kleinste Zahl ungleich Null 00000.00001. Jedes Codebit, das solche Zahlen verarbeitet, muss wissen, wo sich der Dezimalpunkt befindet.

Eine Gleitkommazahl reserviert keine bestimmte Anzahl von Bits für den ganzzahligen Teil oder den gebrochenen Teil. Stattdessen reserviert es eine bestimmte Anzahl von Bits für die Anzahl ( Mantisse oder Signifikand genannt ) und eine bestimmte Anzahl von Bits, um zu sagen, wo innerhalb dieser Zahl die Dezimalstelle liegt ( Exponent genannt ). Eine Gleitkommazahl, die 10 Stellen mit 2 für den Exponenten reservierten Stellen einnimmt, kann also einen größten Wert von 9.9999999e+50und einen kleinsten Wert ungleich Null von darstellen 0.0000001e-49.

Gabe
quelle
8
Nun, Sie vergessen, dass Gleitkommazahlen fast immer vorzeichenbehaftet sind, also wäre der Mindestwert wirklich -9.9999999e+50.
Brian Gordon
4
Es gibt auch eine Exponentenvorspannung, so dass Sie weitaus mehr diskrete Werte zwischen 0 und 1 darstellen können als zwischen 1.000.000 und 1.000.001. Und es gibt viele Komplikationen bei Gleitkommaoperationen, die auftreten, z. B. sicherzustellen, dass Sie 0 nicht als Differenz zwischen zwei sehr ähnlichen Zahlen angeben, wenn die Abweichung nicht ausreicht, um die Genauigkeit zu erhöhen.
Brian Gordon
28
@BrianGordon: Ich habe die Zeichenbits nicht vergessen. Ich habe sie absichtlich ignoriert, um eine einfache Beschreibung zu haben und mich nicht um den Unterschied zwischen Minimum / Maximum und Kleinst / Größt kümmern zu müssen. Ich habe auch absichtlich die Exponentenvorspannung (die nichts mit der Anzahl der diskreten Werte zwischen zwei beliebigen Zahlen zu tun hat), NaNs, Unendlichkeiten, Normalisierung, allmählichen Unterlauf, vorzeichenbehaftete Nullen und die Tatsache, dass die meisten Floats binär sind (was das erste Bit zulässt), weggelassen der Mantisse weggelassen werden) und eine Reihe anderer Aspekte, die zur Veranschaulichung des Konzepts nicht erforderlich sind.
Gabe
2
Warum ist der Grenzwert für die Mindestanzahl von Festpunkten 00000.00001? Ich erwarte 00000.00000stattdessen zu sehen . Haben Sie auch Referenzen, die detaillierter auf Festkommazahlen eingehen?
Nicholas Miller
4
@ NickMiller: Entschuldigung für die Verwirrung, aber ich habe über Zahlen ungleich Null gesprochen. Mein Beispielformat kann 0, 0,00001, 0,00002, ..., 99999,99998, 99999,99999 darstellen.
Gabe
31

Eine feste Punktnummer bedeutet nur, dass nach dem Dezimalpunkt eine feste Anzahl von Stellen steht. Eine Gleitkommazahl ermöglicht eine unterschiedliche Anzahl von Stellen nach dem Dezimalpunkt.

Wenn Sie beispielsweise Zahlen speichern können, für die genau vier Nachkommastellen erforderlich sind, handelt es sich um einen festen Punkt. Ohne diese Einschränkung ist es Gleitkomma.

Wenn ein fester Punkt verwendet wird, verwendet der Programmierer häufig tatsächlich eine Ganzzahl und geht dann davon aus, dass einige der Ziffern über dem Dezimalpunkt liegen. Zum Beispiel möchte ich vielleicht zwei Stellen genau halten, also bedeutet ein Wert von 100 tatsächlich 1,00, 101 bedeutet 1,01, 12345 bedeutet 123,45 usw.

Gleitkommazahlen sind allgemeiner, da sie auf die gleiche Weise sehr kleine oder sehr große Zahlen darstellen können. Es ist jedoch ein kleiner Nachteil, zusätzlichen Speicherplatz für die Dezimalstelle zu benötigen.

Vaughn Cato
quelle
2
Die Verwendung von Gleitkommazahlen wird zu einem Problem, wenn Sie mit ihnen Berechnungen durchführen, z. B. wenn Sie eine wirklich kleine und eine wirklich große Gleitkommazahl addieren. Das summierte Ergebnis verliert an Genauigkeit, da es eine Zahl mit zwei Extremen darstellen muss und die unteren Dezimalstellen abgeschnitten werden (und nicht gerundet werden).
Andrew Norman
2
Auch die mögliche Verwendung von Exponentenwerten in einem Gleitkomma kann Probleme mit Computersystemen verursachen, die Standardzahlen erwarten
Andrew Norman
5

Nach meinem Verständnis wird die Festkomma-Arithmetik mit ganzen Zahlen durchgeführt. wobei der Dezimalteil in einer festen Anzahl von Bits gespeichert ist oder die Zahl mit der Anzahl der benötigten Dezimalstellen multipliziert wird.

Wenn zum Beispiel die Zahl 12.34gespeichert werden muss und nach dem Dezimalpunkt nur zwei Stellen Genauigkeit benötigt werden, wird die Zahl mit multipliziert, um 100zu erhalten 1234. Wenn wir mit dieser Zahl rechnen, verwenden wir diesen Regelsatz. Das Hinzufügen 5620oder 56.20zu dieser Zahl würde 6854in Daten oder ergeben 68.54.

Wenn wir den Dezimalteil einer Festkommazahl berechnen möchten, verwenden wir den Operanden modulo (%).

12,34 (Pseudocode):

v1 = 1234 / 100 // get the whole number
v2 = 1234 % 100 // get the decimal number (100ths of a whole).
print v1 + "." + v2 // "12.34"

Gleitkommazahlen sind eine ganz andere Geschichte in der Programmierung. Der aktuelle Standard für Gleitkommazahlen verwendet etwa 23 Bit für die Daten der Zahl, 8 Bit für den Exponenten und 1 Bit für das Vorzeichen. Weitere Informationen hierzu finden Sie unter diesem Wikipedia-Link.

Herr Goober
quelle
3

Der Begriff "Festpunkt" bezieht sich auf die entsprechende Art und Weise, in der Zahlen dargestellt werden, mit einer festen Anzahl von Ziffern nach und manchmal vor dem Dezimalpunkt. Bei der Gleitkomma-Darstellung kann die Platzierung des Dezimalpunkts relativ zu den signifikanten Ziffern der Zahl "schweben". Beispielsweise kann eine Festkomma-Darstellung mit einer einheitlichen Dezimalpunkt-Platzierungskonvention die Zahlen 123,45, 1234,56, 12345,67 usw. darstellen, während eine Gleitkomma-Darstellung zusätzlich 1,234567, 123456,7, 0,00001234567, 1234567000000000 usw. darstellen könnte.

user3553000
quelle
-6

Nehmen Sie die Nummer 123.456789

  • Als Ganzzahl wäre diese Zahl 123
  • Als Fixpunkt (2) wäre diese Zahl 123,46 (vorausgesetzt, Sie haben sie aufgerundet)
  • Als Gleitkomma wäre diese Zahl 123.456789

Mit Gleitkomma können Sie fast jede Zahl mit großer Präzision darstellen. Behoben ist weniger präzise, ​​aber einfacher für den Computer.

Sparky
quelle
11
Die Genauigkeit, mit der Sie eine Zahl schreiben können, hängt nicht davon ab, ob sie in Gleitkomma-, Ganzzahl- oder Festkommazahlen geschrieben ist. Dies hängt mit der Anzahl der verfügbaren signifikanten Stellen zusammen. Zum Beispiel ist INT_MAX eine Zahl, die genau als int, aber nicht als float dargestellt werden kann, da sie nicht die 31-Bit-Genauigkeit haben, die erforderlich ist, um sie genau darzustellen.
Kian
1
fest ist am genauesten, solange seine Größe für die betreffende Zahl geeignet ist. Wenn Sie mit Festkommazahlen rechnen, erfolgt die Rundung, wenn bei einer Berechnung der Rest die Dezimalgrenze überschreitet. Mit einem Gleitkomma können Sie einen sehr ungenauen Wert erhalten, wenn Sie eine sehr kleine Zahl mit einer sehr großen hinzufügen. Wenn dies auftritt, gehen Ziffern ohne Rundung verloren
Andrew Norman
Das ist irreführend und falsch. Festpunkt bedeutet, dass die Anzahl der Stellen nach dem Dezimalpunkt festgelegt ist. Es sagt nichts darüber aus, wie präzise es ist.
Oscar Smith