Wie viele signifikante Ziffern haben Floats und Doubles in Java?

Lesezeit: 8 Minuten

Wie viele signifikante Ziffern haben Floats und Doubles in Java
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?

  • 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

1646264831 891 Wie viele signifikante Ziffern haben Floats und Doubles in Java
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

http://en.wikipedia.org/wiki/Binary64

http://en.wikipedia.org/wiki/Binary32

  • 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 floatalso 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

1646264832 318 Wie viele signifikante Ziffern haben Floats und Doubles in Java
9999 Jahre

Ein 32-Bit-Float hat eine Genauigkeit von etwa 7 Stellen und ein 64-Bit-Double eine Genauigkeit von etwa 16 Stellen

Lange Antwort:

Fließkommazahlen haben drei Komponenten:

  1. Ein Vorzeichenbit, um festzustellen, ob die Zahl positiv oder negativ ist.
  2. Ein Exponent, um die zu bestimmen Größe der Nummer.
  3. Ein Bruch, der bestimmt, wie weit die Zahl zwischen zwei Exponentenwerten liegt. Dies wird manchmal genannt „der Signifikand, die Mantisse oder der Koeffizient“

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)

Wie viele signifikante Ziffern haben Floats und Doubles in Java
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.

1646264832 831 Wie viele signifikante Ziffern haben Floats und Doubles in Java
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 valueseit value + 1 kann nicht mit codiert werden m * b ^ ewo 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


1646264833 167 Wie viele signifikante Ziffern haben Floats und Doubles in Java
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


917390cookie-checkWie viele signifikante Ziffern haben Floats und Doubles in Java?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy