bei double precision kein exaktes wert?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Das ist bei Fließkommawerten normal, gewöhn dich dran.

Grund ist letztlich die Umrechnung vom Dezimal ins Binärsystem. Wenn das nicht "aufgeht" gibt es immer einen Rundungsfehler.

Du kannst 1/3 einfach nicht als (endliche) reelle Dezimalzahl darstellen, das gibt ne Periode. Und genauso gibt es das bei Binärzahlen auch.

Guckst du, bei 0.7 dezimal kriegst du binär eine Periode:

https://www.binaryconvert.com/result_float.html?decimal=048046055

Hingegen bei 0.25 (=1/4) kein Problem (weil 4 eine Zweierpotenz ist):

https://www.binaryconvert.com/result_float.html?decimal=048046050053

Also kann man die Binärzahl mit einer Dezimalzahl vergleichen, weil bei der Dezimalzahl 1/3 die Periode 3 ist und bei einer Binärzahl von 0.7 die Periode in der Mantisse 00110011 ist?

0
@MobyHick

Was ist dann mit 1.4? wenn ich es konvertiere, dann erhalte ich auch ein exaktes wert von 1.3999... Aber immerhin wird es in java bei double precision als 1.4 angegeben und nicht 1.399...? Denn bei 2.1 bzw. 2.0999... ist es der Fall:(

0
@MobyHick

Natürlich, so eine IEEE Fließkomma-Binärzahl ist genauso wie eine Fließkomma-Dezimalzahl in wisseschaftlicher Exponentialschreibweise aufgebaut.

Man hat eine Mantisse (bestehend aus dem Teil vor dem Komma und dem Teil nach dem Komma) und eben einen Exponenten (zum Verschieben des Kommas).

Bei Binärzahlen sind die Ziffern aber nur 0 oder 1, nicht 0 bis 9. Außerdem ist bei so einer binären IEEE-Fließkommazahl die Anzahl der Stellen (Ziffern insgesamt, vor und nach dem Komma) natürlich fix und damit begrenzt.

Ein "Double" hat eigentlich bei weitem "genug" Ziffern um 0.7 ausreichend genau darzustellen. Nur leider ist 0.7 binär gar nicht ohne Periode darstellbar (auch 0.1 nicht).

Die "Einfachheit" täuscht leider. Wenn man nur Zweierpotenzen (1 durch Zweierpotenzen) hat, dann kann man 0.5 und 0.25 und auch 0.125 usw. ebenso wie Summen daraus sauber darstellen (ohne Periode).

Im Dezimalsystem kriegst du genau dann eine Periode hinter dem Komma, wenn der Teiler andere Primfaktoren als 2 und 5 hat (also andere als die Basis 10 = 2*5).

endlich: 1/2, 1/4, 1/5, 1/8, 1/10

periodisch: 1/3, 1/6, 1/7, 1/9

Und so weiter.

Und binär passiert das selbe, nur dass da nur der Primfaktor 2 in der Basis ist. Also geht nur 1/2, 1/4, 1/8, 1/16, ... sauber auf. Und 1/10 blöderweise nicht. Das brauchst du aber für 0.7 = 7/10 leider.

Und bei einer Periode in den Nachkommastellen ist eben völlig egal, wieviele Nachkommastellen du hast (Float, Double) - es reicht nie. Gibt immer Rundungsfehler. ;)

1
@ArchEnema

Danke sehr. Also scheint double precision "doof" zu sein. Kann man dieses Problem umgehen oder muss man das halt akzeptieren?

0
@MobyHick

Das ist mathematisch unausweichlich. Daher kommt die Vorliebe der Informatik für Zweierpotenzen (1024 statt 1000): Zweierpotenzen funktionieren da einfach. :D

0

Wenn du mit Gleitpunkt-Datentypen rechnest, erhältst du NIEMALS ein exaktes Ergebnis, sondern immer nur Näherungen.

(Einzige stark eingeschränkte Ausnahme sind Dezimalgleitpunkttypen, aber mit denen wirst du als Anfänger sowieso nicht in Berührung kommen.)

Woher ich das weiß:Studium / Ausbildung

Das Problem - grob dargestellt - ist, dass bereits die Dezimalzahl 0.1 unendlich viele Stellen im Binärsystem hat.

Damit kommt es unweigerlich irgendwann zu Rundungsfehlern.

Wenn du es genau wissen willst, kannst du ja dein Beispiel mal "von Hand" konvertieren und durchrechnen

meinst du bei 0.1 dass es "unendlich viele Stellen im Binärsystem" gibt damit, dass irgendeine Binärzahl sich dann ständig wiederholt?

0
@MobyHick

So könnte man das beschreiben, ja.
Wie "Periode" im Dezimalsystem. Egal wieviele Nachkommastellen du hast, ganz genau wirst du die Zahl nie darstellen können. So verhält es sich auch im Binärsystem, jedoch sind es andere Zahlen, die man nicht genau darstellen kann. Welche Zahlen sich nicht genau darstellen lassen hängt vom System ab. 0,1 lässt sich in Dezimal genau darstellen, ist in Binär aber eine Periode-Zahl.

0
@MrAmazing2

Aber warum wird dann 1.4 in java exakt dargestellt? Denn wenn man 1.4 konvertiert, erhält man auch so ein ergebniss wie 1.3999.. Dennoch wird es in java als 1.4 angegeben. Die zahl 2.1 wiederum als 2.09999.. Das hat iwie keine logik

0
@MobyHick

Ich denke ab einer bestimmten minimalen Abweichung (0.00000000...1) wird bei der Ausgabe der Zahl auf- /abgerundet. Nur leider ist diese Minimale Abweichung nicht immer erreicht

0

Was möchtest Du wissen?