Sie sind nicht angemeldet.

Matt

Fuck me, I'm famous

  • »Matt« ist der Autor dieses Themas

Beiträge: 214

Wohnort: Nähe Bodensee

Beruf: Informatikkaufmann

Danksagungen: 6

  • Nachricht senden

1

09.11.2009, 14:58

Frage zu IEEE 754 (int zu float)

Mal so ne blöde Frage:

In unserem Programmentwicklungspraktikum stellte sich die Aufgabe, warum man eine Integer Zahl, die als IEEE754 kodiert ist, nicht in float umwandeln soll. Hier die Aufgabenstellung:

Zitat

Eine IEEE-754 kodierte Zahl sei in einer Ganzzahl-Variablen int iwert abgelegt.
Erklären Sie, warum die Verwendung des cast-Operators (float)

float fwert = (float) iwert;

ungeeignet ist, die IEEE-754 kodierte Zahl iwert in den Typ float umzuwandeln.
Okay, also mal ausprobiert. Wollte ne Ganzzahl 12345654 genauso wie in der Aufgabe beschrieben in float umwandeln, um zu schauen, was passiert. Naja, was passiert ist, das Ergebnis lautet 1.2345654E7. Nach einem kleinen Test, stellt sich heraus, das die beiden Zahlen genau das gleiche Ergebnis ausspucken, wenn man sie mit 2 multipliziert. Ich hatte eigentlich Rundungsfehler erwartet, aber keine erhalten. Ich stehe irgendwie aufm Schlauch, da ich auch bei Wikipedia nichts dazu gefunden habe außer eben, dass beim Rückwandeln in eine Dezimalzahl Rundungsfehler entstehen. Ich verstehe auch nicht, warum es überhaupt sinnvoll sein soll, eine Ganzzahl in float umzuwandeln.

Meine Antwort auf die Frage habe ich so formuliert:

Zitat

Weil bestimmte Zahlen im Binärsystem nicht exakt dargestellt werden können. Da würde z. B. 5,49 bei einer Rückumwandlung von der gerundeten float Zahl Ungenauigkeiten auftreten. In diesem Fall wäre 5,49 rückgewandelt 5,489999999999781. Dadurch würde beim weiterrechnen Ungenauigkeiten entstehen.
Naja, danke für Euren Rat! Achso ja, es handelt sich um JAVA.

gruß, mätt

turbo

Schüler

Beiträge: 142

  • Nachricht senden

2

10.11.2009, 03:40

im prinzip hast du schon erkannt, man kann in der binärdarstellung nicht alle zahlen exakt abbilden. float bietet maximal 8 nachkommastellen, double 16. werden mehr nachkommastellen benötigt, geht genauigkeit verloren. sinn macht die verwendung von float/double, wenn der von int und long abgedeckte zahlenbereich zu klein ist um die zu speichernden werte aufzunehmen oder wenn ein int/long mit float/double verrechnet werden soll. in so einem falle, wird der int automatisch intern in float gewandelt ("widening") und dann verrechnet. das ergebnis ist dann wieder float/double. aufgrund der eher bescheidenen genauigkeit von float würde ich gleich auf double gehen. man minimiert dadurch rundungsfehler. der zusätzliche speicherverbrauch ist heutzutage nun wirklich kein problem mehr, die ungenauigkeit dagegen schon eher. sinn macht die verwendung von double statt long z.b. auch, wenn die ungenauigkeit von double weniger problematisch ist als ein integerüberlauf, also der sprung von z.b. betragsmäßig großen positiven zahlen zu betragsmäßig großen negativen zahlen.

will man mehr präzision bei verwendung von doubles, sollte man berechnungen am besten in einem rutsch machen und nicht zwischenergebnisse abspeichern und was anderes tun, da hierbei die zwischenergebnisse aus den 80 bit langen fpu-registern (gilt nur für x86-cpus) in den ram verschoben werden, wo nur noch 64 bit pro double zur verfügung stehen. gerade wenn viele folgeberechnungen anstehen, kann sich das negativ in form von rundungsfehlern auswirken. insbesondere natürlich bei betragsmäßig kleinen zahlen. auch die reihenfolge von berechnungen wirkt sich auf die genauigkeit aus. beispiel: die summe von 1/n mit n von 1 bis 1000 und das gleiche mit n von 1000 bis 1. die ergebnisse unterscheiden sich.

btw: ieee754 bezieht sich ausschließlich auf fließkommazahlen. integer gemäß ieee754 gibts also nicht ;)

Matt

Fuck me, I'm famous

  • »Matt« ist der Autor dieses Themas

Beiträge: 214

Wohnort: Nähe Bodensee

Beruf: Informatikkaufmann

Danksagungen: 6

  • Nachricht senden

3

10.11.2009, 17:07

Danke für deine tolle Antwort. :D

Aber warum stellt man dann so hirnrissige Frage? Ich verstehs manchmal echt net...

Werbung

Lesezeichen:

Forenuser - Die Foren
Findmaschine