Anzeige:

Datentypen in C - Genauigkeit??

Hier finden sie die archivierten Beiträge des alten PHPBB Forums von www.loetstelle.net

Datentypen in C - Genauigkeit??

Von steve84 am 03.09.2010 18:42

Ich bin gerade beim Durcharbeiten des Buches "C Programmierung von Anfang an".
Nun stellt sich mir am Anfang eine grundlegende Frage bei den Datentypen bezüglich der Genauigkeit:

2 Beispiele aus dem Buch:
float:
0.12345678901234567890 + 5 + 5 = 10.12345695495605500
double:
0.12345678901234567890 + 5 + 5 = 10.12345678901234400

float hat ja 4Byte und double 8Byte

Wie kommt diese unterstrichene Ungenauigkeit zustande???
Ich habe anscheinend ein Verständnisproblem...

Von BellaD am 03.09.2010 22:50

moin

Ist das jetzt nur Theorie aus dem Buch oder auf nem Taschenrechner oder
auf nem Pentium oder oder?

Wer intensiv mit einem Rechenhilfsmittel arbeitet, muss diese Eigenschaften kennen. Sie gehen auf die begrenzte Genauigkeit zurück, mit der Mantisse und Exponent gespeichert werden...

http://de.wikipedia.org/wiki/Gleitkommazahl

mfg

Von Elektron am 03.09.2010 22:51

Also. ein float ist ein Wort breit, ein double zwei Wörter. Arbeitest du auch einem 32 Bit System, dann ist die Wortlänge 4 Bytes, also ein float 4 Bytes und double 8 Bytes.

Nach IEEE 754 (siehe Wikipedia) wird eine Gleitkommazahl nach Mantisse und Exponent intern so gespeichert:

Single: Mantisse: 23 Bit, Exponent: 8 Bit, 1 Bit für das Vorzeichen
Double: Mantisse 52 Bit, Exponent: 11 Bit, 1 Bit für das Vorzeichen

Das was du da siehst ist die Ungenauigkeit der Mantisse. Bei einem Float (oder Single, wie man es nennt) sind es 23 Bit, also 2 hoch 23 = 8388608 Möglichkeiten, also fast 7 Dezimalstellen Genauigkeit. Bei Double sind es 2 hoch 52 = 4503599627370496 Möglichkeiten, also fast 16 Stellen Genauigkeit. Intern ist bei der Mantisse das Komma immer nach der ersten Stelle, also:

1.012345 x 10^1 (Single)
1.012345678901234 x 10^1 (Double)

Dass bei dem Single eine Stelle mehr stimmt, ist purer Zufall. Kann sein, ist aber nicht garantiert.

edit:
Ich hab den entsprechenden Code mal auf meinem Pc ausgeführt:

Zitat:

10.123456954956054688
10.123456789012344359

Von steve84 am 04.09.2010 19:42

Zitat:
Single: Mantisse: 23 Bit, Exponent: 8 Bit, 1 Bit für das Vorzeichen
Double: Mantisse 52 Bit, Exponent: 11 Bit, 1 Bit für das Vorzeichen

Wie kommt man dabei auf man Mantisse und Exponent??
Soll man sich diese Zahlen merken, oder gibts da eine einfache Berechung?
Bin noch nicht darauf gekommen...

Von derguteweka am 05.09.2010 12:22

Moin,

steve84 hat folgendes geschrieben:
Wie kommt man dabei auf man Mantisse und Exponent??

Steht in der IEEE754. Hat sich halt als guenstig erwiesen.

steve84 hat folgendes geschrieben:
Soll man sich diese Zahlen merken, oder gibts da eine einfache Berechung?
Bin noch nicht darauf gekommen...

Halt' ich fuer voellig ueberfluessig, sich da was zu merken. Das ist ungefaehr so, wie wenn du dir im Rahmen deiner Fuehrerscheinausbildung anfaengst, zu merken, wie die Klemmenbezeichnungen der Leitungen am Sicherungskasten und am Blinkrelais des Autos sind.

Wichtig ist, als Folge der Ungenauigkeit der Zahlendarstellung, niemals 2 floats oder doubles auf Gleichheit mittels == Operator zu pruefen.
Wenn man tatsaechlich mal irgendwelche hochkomplexen Probleme in C zu loesen hat, bei denen die Genauigkeit eine Rolle spielt und nicht irgendwie durch einen clever gewaehlten Algorithmus erschlagen werden kann, gibts diverse libraries, die Zahlenformate und Rechenoperationen mit ausreichender Genauigkeit zur Verfuegung stellen - zB. mpfr, gmp, mpc.

Gruss
WK

Von steve84 am 06.09.2010 20:11

Leute,
Ich komme einfach trozdem nicht darauf.

Zitat:
Double: Mantisse 52 Bit, Exponent: 11 Bit, 1 Bit für das Vorzeichen

-> Wie komme ich einfach bei dem Double (8 Byte) darauf, dass die Matisse 52 Bit hat und der Exponent 11 Bit hat ???

Von derguteweka am 06.09.2010 21:01

Moin,

steve84 hat folgendes geschrieben:
-> Wie komme ich einfach bei dem Double (8 Byte) darauf, dass die Matisse 52 Bit hat und der Exponent 11 Bit hat ???


Du guckst bei der Wikipedia (oder sonstwo) nach, dort gibts z.b. eine Tabelle:
http://de.wikipedia.org/wiki/IEEE_754#Zahlenformate_und_andere_Festlegungen_des_IEEE-754-Standards

Und da steht das in der Zeile mit typ=double drinnen. Fertig Smile

Gruss
WK

Anzeige: