Hat ein Float 32 Binärziffern und ein Double 64 Binärziffern? Die Dokumentation war zu schwer zu verstehen.
Lassen sich alle Bits in signifikante Ziffern übersetzen? Oder nimmt die Position des Dezimalpunkts einige der Bits ein?
Eamon Moloney
Hat ein Float 32 Binärziffern und ein Double 64 Binärziffern? Die Dokumentation war zu schwer zu verstehen.
Lassen sich alle Bits in signifikante Ziffern übersetzen? Oder nimmt die Position des Dezimalpunkts einige der Bits ein?
Markus
schweben: 32 Bit (4 Bytes) wo 23 Bit werden für die Mantisse verwendet (ca. 7 Dezimalstellen). 8 Bits werden für den Exponenten verwendet, sodass ein Float den Dezimalpunkt mit diesen 8 Bits nach rechts oder links „bewegen“ kann. Dadurch wird vermieden, dass viele Nullen in der Mantisse gespeichert werden, wie in 0,0000003 (3 × 10-7) oder 3000000 (3 × 107). Es wird 1 Bit als Vorzeichenbit verwendet.
doppelt: 64 Bit (8 Byte) wo 52 Bit werden für die Mantisse verwendet (ca. 16 Dezimalstellen). 11 Bit werden für den Exponenten verwendet und 1 Bit ist das Vorzeichenbit.
Da wir Binär verwenden (nur 0 und 1), ist ein Bit in der Mantisse implizit 1 (sowohl Float als auch Double verwenden diesen Trick), wenn die Zahl nicht Null ist.
Da alles binär ist (Mantisse und Exponenten), sind die Umrechnungen in Dezimalzahlen normalerweise nicht genau. Zahlen wie 0,5, 0,25, 0,75, 0,125 werden genau gespeichert, 0,1 jedoch nicht. Wie andere gesagt haben, wenn Sie Cent genau speichern müssen, verwenden Sie nicht float oder double, verwenden Sie int, long, BigInteger oder BigDecimal.
Quellen:
http://en.wikipedia.org/wiki/Floating_point#IEEE_754:_floating_point_in_modern_computers
Was meinst du mit 6 bis 9? wie kann es sich ändern? Wenn ich also einen Code mit 8 Dezimalstellen wie 0,000000001 mehrmals ausführe, erhalte ich unterschiedliche Ergebnisse? meinst Du das?
– Äquitas
28. Oktober 2015 um 2:58 Uhr
Manche Zahlen lassen sich binär genauer darstellen als andere. Sie können den Unterschied in 0,125 (1/8, acht ist eine Zweierpotenz) und 0,1 (1/10, zehn ist keine Zweierpotenz) erkennen. Ersteres hat mehr (Dezimal-)Stellen, wird aber exakt dargestellt. So kann es sein, dass eine Zahl mit 6 Nachkommastellen größere Rundungsfehler aufweist als eine andere Zahl mit 8 Stellen.
– Markus
28. Oktober 2015 um 12:39 Uhr
15,9 Dezimalstellen für double
und 7,2 für float
also 15 und 7. Einige größere Zahlen können in jedem Fall dargestellt werden, und nichts davon gilt für Brüche, aber es gibt keinen “Durchschnitt” darüber, und keine Ihrer Quellen sagt etwas anderes.
– Benutzer207421
9. März 2016 um 23:49 Uhr
Wenn Ihnen das Wort Durchschnitt nicht gefällt, schlagen Sie eine Änderung vor. Es wurde überhaupt nicht von mir hinzugefügt, es wurde von jemand anderem bearbeitet … (und ich sah wirklich keine Notwendigkeit für diese Bearbeitung).
– Markus
15. Dezember 2016 um 15:14 Uhr
Interessanterweise gibt es tatsächlich eine Genauigkeitsziffer mehr als in der Mantisse/Signifikanten gespeichert. 23 und 52 Bit werden für Float bzw. Double gespeichert, aber da die Zahlen normalisiert sind, können wir ein führendes 1-Bit annehmen und es dann weglassen. Aus diesem Grund beträgt die effektive Genauigkeit 24 bzw. 53 Bit. Die genauen Dezimalgenauigkeiten werden mit log10(2^24) = 7,22 und log10(2^53) = 15,95 berechnet
– Georgie
8. November 2018 um 21:58 Uhr
9999 Jahre
Lange Antwort:
Fließkommazahlen haben drei Komponenten:
Im Wesentlichen funktioniert dies sign * 2^exponent * (1 + fraction)
. Die „Größe“ der Zahl, ihr Exponent, ist für uns unerheblich, weil sie nur Waage der Wert des Bruchteils. Wissend, dass log₁₀(n)
gibt die Anzahl der Stellen von an n
,† können wir mit die Genauigkeit einer Fließkommazahl bestimmen log₁₀(largest_possible_fraction)
. Weil jedes Bit in einem Float 2 Möglichkeiten speichert, eine Binärzahl von n
Bits können eine Zahl bis zu speichern 2ⁿ - 1
(insgesamt 2ⁿ
Werte wobei einer der Werte Null ist). Dies wird etwas haariger, da sich herausstellt, dass Gleitkommazahlen mit einem Bit weniger Bruch gespeichert werden, als sie verwenden können, da Nullen speziell dargestellt werden und alle Nicht-Null-Zahlen mindestens ein Binärbit ungleich Null haben.‡
Kombiniert man dies, ergibt sich die Stellengenauigkeit für eine Fließkommazahl
log₁₀(2ⁿ)
wo n
ist die Anzahl der Bits des Bruchs der Gleitkommazahl. Ein 32-Bit-Gleitkomma hat 24 Bruchbits für eine Genauigkeit von ≈7,22 Dezimalstellen, und ein 64-Bit-Double hat 53 Bruchbits für eine Genauigkeit von ≈15,95 Dezimalstellen.
Weitere Informationen zur Gleitkommagenauigkeit finden Sie unter dem Konzept von a Maschinen-Epsilon.
† Zum n ≥ 1
zumindest – für andere Zahlen sieht Ihre Formel eher so aus
⌊log₁₀(|n|)⌋ + 1
.
‡ „Diese Regel wird verschiedentlich als führende Bit-Konvention, implizite Bit-Konvention oder versteckte Bit-Konvention bezeichnet.“ (Wikipedia)
Denys Séguret
Von Java-Spezifikation :
Die Fließkommatypen sind Float und Double, die konzeptionell den IEEE 754-Werten und -Operationen im 32-Bit-Format mit einfacher Genauigkeit und im 64-Bit-Format mit doppelter Genauigkeit zugeordnet sind, wie im IEEE-Standard für binäre Gleitkommaarithmetik, ANSI/IEEE, spezifiziert Standard 754-1985 (IEEE, New York).
Da es schwierig ist, etwas mit Zahlen zu tun, ohne die Grundlagen von IEEE754 zu verstehen, hier ein weiterer Link.
Es ist wichtig zu verstehen, dass die Genauigkeit nicht einheitlich ist und dass dies keine exakte Speicherung der Zahlen ist, wie dies bei ganzen Zahlen der Fall ist.
Ein Beispiel :
double a = 0.3 - 0.1;
System.out.println(a);
Drucke
0.19999999999999998
Wenn Sie eine willkürliche Genauigkeit benötigen (z. B. für finanzielle Zwecke), benötigen Sie möglicherweise Große Dezimalzahl.
Eine normale mathematische Antwort.
Wenn man versteht, dass eine Gleitkommazahl als einige Bits implementiert ist, die den Exponenten und den Rest darstellen, die meisten für die Ziffern (im Binärsystem), hat man die folgende Situation:
Bei einem hohen Exponenten, sagen wir 10²³, wenn das niedrigstwertige Bit geändert wird, erscheint ein großer Unterschied zwischen zwei benachbarten unterscheidbaren Zahlen. Außerdem sorgt der Dezimalpunkt zur Basis 2 dafür, dass viele Zahlen zur Basis 10 nur angenähert werden können; 1/5, 1/10 sind Endloszahlen.
Also rein Allgemeines: Fließkommazahlen sollten nicht verwendet werden, wenn Sie Wert auf signifikante Ziffern legen. Für Geldbeträge mit Berechnung, e,a, am besten verwenden BigDecimal.
Zum Physik Fließkomma Doppel ausreichend sind, schwimmt fast nie. Darüber hinaus kann der Fließkommateil von Prozessoren, die FPU, intern sogar etwas mehr Präzision verwenden.
schäbig
Fließkommazahlen werden mit einer Exponentialform kodiert, das ist so etwas wie m * b ^ e
, dh überhaupt nicht wie ganze Zahlen. Die Frage, die Sie stellen, wäre im Kontext sinnvoll Festkommazahlen. Es gibt zahlreiche Bibliotheken für Festkommaarithmetik erhältlich.
Zur Gleitpunktarithmetik: Die Anzahl der Nachkommastellen hängt von der Darstellung und dem Zahlensystem ab. Zum Beispiel gibt es periodische Zahlen (0.33333
), die keine endliche Darstellung in Dezimalzahl haben, aber eine in Binärzahl und umgekehrt.
Es ist auch erwähnenswert, dass Gleitkommazahlen bis zu einem bestimmten Punkt eine Differenz größer als eins haben, dh value + 1
Erträge value
seit value + 1
kann nicht mit codiert werden m * b ^ e
wo m
, b
und e
sind in der Länge fixiert. Dasselbe passiert für Werte kleiner 1, dh alle möglichen Codepunkte haben nicht den gleichen Abstand.
Aus diesem Grund gibt es keine genaue Angabe n
Ziffern wie bei Festkommazahlen, da nicht jede Zahl mit n
Dezimalziffern haben eine IEEE-Kodierung.
Es gibt ein fast obligatorisches Dokument, das Sie dann lesen sollten, das Gleitkommazahlen erklärt:
Was jeder Informatiker über Gleitkommaarithmetik wissen sollte.
+1 für die Erwähnung von “Was jeder Informatiker über Gleitkommaarithmetik wissen sollte”. Es ist jedoch erwähnenswert jeden Zahl, die eine endliche binäre Bruchdarstellung hat, hat auch eine endliche Dezimaldarstellung. Das Problem besteht nur darin, von Dezimal zu Binär zu wechseln.
– Patricia Shanahan
24. November 2012 um 18:38 Uhr
Louis Wassermann
Ansehen Float.intBitsToFloat
und Double.longBitsToDouble
, die erklären, wie Bits Fließkommazahlen entsprechen. Insbesondere die Bits eines normalen float
so etwas aussehen
s * 2^exp * 1.ABCDEFGHIJKLMNOPQRSTUVW
wobei A…W 23 Bits sind – Nullen und Einsen – die einen Bruch in Binärform darstellen – s +/- 1 ist, dargestellt durch eine 0 bzw. eine 1, und exp eine vorzeichenbehaftete 8-Bit-Ganzzahl ist.
+1 für die Erwähnung von “Was jeder Informatiker über Gleitkommaarithmetik wissen sollte”. Es ist jedoch erwähnenswert jeden Zahl, die eine endliche binäre Bruchdarstellung hat, hat auch eine endliche Dezimaldarstellung. Das Problem besteht nur darin, von Dezimal zu Binär zu wechseln.
– Patricia Shanahan
24. November 2012 um 18:38 Uhr
Lassen sich all diese Bits in signifikante Ziffern übersetzen? Oder nimmt die Position des Dezimalpunkts einige der Bits ein?
– Eamon Moloney
24. November 2012 um 16:14 Uhr
@ user1774214 Gleitkommazahlen sind überhaupt nicht wie Ganzzahlen codiert. schau dir mal den link an den ich gebe. Sie müssen zum Beispiel verstehen, dass die Genauigkeit nicht einheitlich ist.
– Denys Séguret
24. November 2012 um 16:14 Uhr
@dystroy Ich bin mir nicht sicher, was du mit “die Präzision ist nicht einheitlich” meinst. Es ist ziemlich einheitlich 53 und 24 Bit Genauigkeit, es sei denn, Sie beziehen sich auf Denormals.
– Pascal Cuoq
20. Juni 2014 um 8:55 Uhr
@PascalCuoq es gibt mehr Präzision für kleinere Zahlen. Wenn sich der Exponent ändert (oder der Punkt schwebt), stellt die Mantisse weiterhin die gleiche Anzahl von Ziffern dar. Wenn die Zahl also groß ist, kann die Mantisse niedrigere signifikante Stellen nicht so weit “erreichen”, was weniger Genauigkeit ergibt.
– Vituel
23. März 2015 um 13:54 Uhr
@Virtuel Die Genauigkeit beträgt 53 Bit. Dass nennen wir Präzision. Sie scheinen an die zu denken absolute Genauigkeit oder so.
– Pascal Cuoq
23. März 2015 um 13:57 Uhr