Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
steve84
Anmeldungsdatum: 29.03.2008 Beiträge: 85
|
Verfasst am: Fr 03.Sep 2010 18:42:11 Titel: Datentypen in C - Genauigkeit?? |
|
|
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... |
|
Nach oben |
|
 |
BellaD

Anmeldungsdatum: 03.12.2006 Beiträge: 1708 Wohnort: Klinik der misshandelten Kuscheltiere
|
Verfasst am: Fr 03.Sep 2010 22:50:29 Titel: |
|
|
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 _________________ Eine Weiterverbreitung ohne ausdrückliche Genehmigung ist untersagt. Für Schäden, lehnen wir jegliche Haftung ab. |
|
Nach oben |
|
 |
Elektron
Anmeldungsdatum: 16.03.2008 Beiträge: 1049
|
Verfasst am: Fr 03.Sep 2010 22:51:18 Titel: |
|
|
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
|
|
|
Nach oben |
|
 |
steve84
Anmeldungsdatum: 29.03.2008 Beiträge: 85
|
Verfasst am: Sa 04.Sep 2010 19:42:46 Titel: |
|
|
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... |
|
Nach oben |
|
 |
derguteweka
Anmeldungsdatum: 18.12.2005 Beiträge: 1466
|
Verfasst am: So 05.Sep 2010 12:22:37 Titel: |
|
|
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 |
|
Nach oben |
|
 |
steve84
Anmeldungsdatum: 29.03.2008 Beiträge: 85
|
Verfasst am: Mo 06.Sep 2010 20:11:39 Titel: |
|
|
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 ??? |
|
Nach oben |
|
 |
derguteweka
Anmeldungsdatum: 18.12.2005 Beiträge: 1466
|
|
Nach oben |
|
 |
Anzeige
|
Verfasst am: Heute 19:39:16 Titel: |
|
|
|
|
Nach oben |
|
 |
|