Gleitkommazahlen

Neue Frage »

Auf diesen Beitrag antworten »
zisu Gleitkommazahlen

Meine Frage:
Ich habe ein float a mit 0.6 und ein double b mit 0.6 .
Wenn ich beiden hintereinander immer wieder 0.1 dazuaddiere , bekomme ich nach fünf Mal für
das float a 1.6000001 und für das double b 1.5999999999999999 heraus .
Wie kommt es zu diesen Ergebnissen ?

Meine Ideen:
Ich weiß , dass einige Dezimalzahlen , darunter auch 0.1 , binär nicht genau dargestellt werden können . Ich kann aber nicht genau erklären , wie diese Ergebnisse enstehen und vor allem warum sich das Ergebnis für a von dem Ergebnis für b unterscheidet .
 
Auf diesen Beitrag antworten »
eulerscheZahl

Dazu musst du erst einmal wissen, wie 0.1 binär aussieht: 0.00011001100110011001100110011001100110011...

Es kommen also immer 2 0en und 2 1en im Wechsel.
Beim float hat die Mantisse 23 Bit, also endet die Zahl (Normalisierung und hidden Bit beachten) auf 001100. Danach käme aber eine 1, es wird aufgerundet zu 001101. Es ist also nicht verwunderlich, dass das Ergebnis zu groß ausfällt.

Beim double wird die Mantisse anders gerundet (11001 zu 11010) - allerdings auch aufgerundet.

Ich habe mal versucht, deine Aussage nachzuvollziehen:
code:
1:
2:
3:
4:
5:
6:
7:
#include <stdio.h>

int main(){
	double d = 0.6;
	for(int i = 0; i < 10; i++) d += 0.1;
	printf("%.20lf\n",d);
}

gibt bei mir 1.60000000000000031086 für das double.
Beim float ist es 1.60000026226043701172.
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »