loetstelle.net
Lötstelle Userforum
 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen   RegistrierenRegistrieren 
 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Datentypen in C - Genauigkeit??

 
Neues Thema eröffnen   Neue Antwort erstellen    loetstelle.net Foren-Übersicht -> Microcontroller und DSP
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
steve84



Anmeldungsdatum: 29.03.2008
Beiträge: 85

BeitragVerfasst am: Fr 03.Sep 2010 18:42:11    Titel: Datentypen in C - Genauigkeit?? Bauteile finden Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
BellaD



Anmeldungsdatum: 03.12.2006
Beiträge: 1708
Wohnort: Klinik der misshandelten Kuscheltiere

BeitragVerfasst am: Fr 03.Sep 2010 22:50:29    Titel: Bauteile finden Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Elektron



Anmeldungsdatum: 16.03.2008
Beiträge: 1049

BeitragVerfasst am: Fr 03.Sep 2010 22:51:18    Titel: Bauteile finden Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
steve84



Anmeldungsdatum: 29.03.2008
Beiträge: 85

BeitragVerfasst am: Sa 04.Sep 2010 19:42:46    Titel: Bauteile finden Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
derguteweka



Anmeldungsdatum: 18.12.2005
Beiträge: 1466

BeitragVerfasst am: So 05.Sep 2010 12:22:37    Titel: Bauteile finden Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
steve84



Anmeldungsdatum: 29.03.2008
Beiträge: 85

BeitragVerfasst am: Mo 06.Sep 2010 20:11:39    Titel: Bauteile finden Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
derguteweka



Anmeldungsdatum: 18.12.2005
Beiträge: 1466

BeitragVerfasst am: Mo 06.Sep 2010 21:01:35    Titel: Bauteile finden Antworten mit Zitat

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
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Anzeige






Verfasst am: Heute 09:12:25    Titel: Bauteile finden

Nach oben
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    loetstelle.net Foren-Übersicht -> Microcontroller und DSP Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum nicht herunterladen


Powered by phpBB 2.x © 2001, 2002 phpBB Group

Sie sind Besucher Nr. 1222440
©opyright by Markus Vohburger 2005 All Rights reserved