Es gibt zahlreiche Möglichkeiten, gebrochene Zahlen zu speichern, und jede von ihnen hat Vor- und Nachteile.
Gleitkomma ist mit Abstand das beliebteste Format. Dazu werden ein Vorzeichen, eine Mantisse und ein Exponent zur Basis 2 mit Vorzeichen in ganze Zahlen codiert und in eine Reihe von Bits gepackt. Zum Beispiel könnten Sie eine 32-Bit-Mantisse von 0.5
(codiert als 0x88888888
) und einen 32-Bit-Exponenten mit Vorzeichen von +3
( 0x00000003
) haben, der zu 4.0
( decodieren würde.0.5 * 2 ^ 3
). Gleitkommazahlen sind schnell, weil sie in Hardware implementiert sind und ihre Genauigkeit mit absoluter Größe skaliert wird, dh je kleiner die Zahl, desto besser ist Ihre absolute Genauigkeit, sodass der relative Rundungsfehler mit absoluter Größe konstant bleibt. Floats eignen sich hervorragend für Werte, die aus einem kontinuierlichen Bereich abgetastet werden, z. B. Längen, Schalldruckpegel, Lichtpegel usw., und werden daher häufig in der Audio- und Bildverarbeitung sowie in statistischen Analysen und physikalischen Simulationen verwendet. Ihr größter Nachteil ist, dass sie nicht genau sind, das heißt, sie neigen zu Rundungsfehlern und sie können nicht alle Dezimalbrüche genau darstellen. Alle gängigen Programmiersprachen haben eine Art Gleitkomma.
Fixpunktverwendet ausreichend große ganze Zahlen und reserviert implizit einen Teil ihrer Bits für den Bruchteil. Beispielsweise reserviert eine 24,8-Bit-Festkommazahl 24 Bit für den ganzzahligen Teil (einschließlich Vorzeichen) und 8 Bit für den gebrochenen Teil. Wenn Sie diese Zahl um 8 Bit nach rechts verschieben, erhalten Sie den ganzzahligen Teil. Festkommazahlen waren früher beliebt, als Hardware-Gleitkommazahlen selten oder zumindest viel langsamer waren als ihre ganzzahligen Gegenstücke. Festkommazahlen sind zwar in Bezug auf die Genauigkeit etwas einfacher zu handhaben (wenn auch nur, weil sie einfacher zu überlegen sind), sie sind jedoch in nahezu jeder anderen Hinsicht schlechter als Gleitkommazahlen - sie haben weniger Genauigkeit, einen geringeren Bereich und weil sie zusätzlich sind Operationen sind erforderlich, um Berechnungen für die implizite Verschiebung zu korrigieren. Die Festkomma-Mathematik ist heutzutage oft langsamer als die Gleitkomma-Mathematik.
Dezimaltypen funktionieren ähnlich wie Gleitkommazahlen oder Festkommazahlen, setzen jedoch ein Dezimalsystem voraus, dh ihr Exponent (implizit oder explizit) codiert die Potenz 10 und nicht die Potenz 2. Eine Dezimalzahl könnte zum Beispiel eine Mantisse von 23456
und einen Exponenten von codieren -2
, und dies würde sich erweitern auf234.56
. Dezimalzahlen sind langsamer als Gleitkommazahlen, da die Arithmetik nicht fest in der CPU verankert ist. Sie eignen sich jedoch ideal für alle Fälle, in denen Dezimalzahlen erforderlich sind und bei denen diese Zahlen genau sein müssen. Anzeigetafeln usw. In einigen Programmiersprachen sind Dezimaltypen integriert (z. B. C #), in anderen sind Bibliotheken erforderlich, um sie zu implementieren. Beachten Sie, dass Dezimalzahlen zwar nicht wiederholende Dezimalbrüche genau darstellen können, ihre Genauigkeit jedoch nicht besser ist als die von Gleitkommazahlen. Wenn Sie Dezimalzahlen auswählen, erhalten Sie lediglich exakte Darstellungen von Zahlen, die in einem Dezimalsystem exakt dargestellt werden können (genau wie Floats binäre Brüche exakt darstellen können).
Rationale Zahlen speichern einen Zähler und einen Denumerator, wobei normalerweise ein ganzzahliger Bignum-Typ verwendet wird (ein numerischer Typ, der so groß werden kann, wie es die Speicherbeschränkungen des Computers zulassen). Dies ist der einzige Datentyp aus dem Bündel, der Zahlen wie 1/3
oder genau modellieren kann 3/17
, und Operationen an ihnen führen im Gegensatz zu den anderen Datentypen zu korrekten Ergebnissen für Dinge wie3 * 1/3
. Die Mathematik ist ziemlich einfach, obwohl es ziemlich schwierig ist, einen effizienten Faktorisierungsalgorithmus zu entwickeln. In einigen Programmiersprachen sind rationale Typen integriert (z. B. Common Lisp). Zu den Nachteilen von rationalen Methoden gehört, dass sie langsam sind (viele Operationen erfordern das Reduzieren von Brüchen und das Faktorisieren ihrer Komponenten), und dass viele allgemeine Operationen schwer oder unmöglich zu implementieren sind. Die meisten Implementierungen führen dazu, dass das Rationale in einen Schwebezustand übergeht, wenn dies geschieht (z. B. wenn Sie einen Aufruf tätigen) sin()
auf einem rationalen).
BCD (Binary Coded Decimal) verwendet "Nibbles" (Gruppen von 4 Bits), um einzelne Ziffern zu codieren. Da ein Nibble 16 verschiedene Werte enthalten kann, Dezimalzahlen jedoch nur 10 erfordern, gibt es 6 "unzulässige" Werte pro Nibble. Wie Dezimalzahlen sind auch BCD-Zahlen dezimalgenau, dh, Berechnungen mit Dezimalzahlen funktionieren genauso wie mit Stift und Papier. Arithmetische Regeln für BCD sind etwas umständlich, aber der Vorteil ist, dass das Konvertieren in Zeichenfolgen einfacher ist als bei einigen anderen Formaten, was besonders für ressourcenarme Umgebungen wie eingebettete Systeme interessant ist.
Zeichenfolgen , ja, einfache alte Zeichenfolgen, können auch zur Darstellung von Bruchzahlen verwendet werden. Technisch ist dies BCD sehr ähnlich, nur dass es einen expliziten Dezimalpunkt gibt und Sie ein vollständiges Byte pro Dezimalstelle verwenden. Daher ist das Format verschwenderisch (nur 11 von 256 möglichen Werten werden verwendet), aber es ist einfacher zu analysieren und zu generieren als BCD. Da alle verwendeten Werte "unauffällig", harmlos und plattformneutral sind, können Zeichenfolgen-codierte Zahlen problemlos über Netzwerke übertragen werden. Es ist ungewöhnlich, dass das Rechnen direkt mit Zeichenfolgen ausgeführt wird, aber es ist möglich, und wenn Sie dies tun, sind sie genauso dezimalgenau wie die anderen Dezimalformate (Dezimalzahlen und BCD).