Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort
Vorwort des Gutachters
1 Einstieg in C
2 Das erste Programm
3 Grundlagen
4 Formatierte Ein-/Ausgabe mit »scanf()« und »printf()«
5 Basisdatentypen
6 Operatoren
7 Typumwandlung
8 Kontrollstrukturen
9 Funktionen
10 Präprozessor-Direktiven
11 Arrays
12 Zeiger (Pointer)
13 Kommandozeilenargumente
14 Dynamische Speicherverwaltung
15 Strukturen
16 Ein-/Ausgabe-Funktionen
17 Attribute von Dateien und das Arbeiten mit Verzeichnissen (nicht ANSI C)
18 Arbeiten mit variabel langen Argumentlisten – <stdarg.h>
19 Zeitroutinen
20 Weitere Headerdateien und ihre Funktionen (ANSI C)
21 Dynamische Datenstrukturen
22 Algorithmen
23 CGI mit C
24 MySQL und C
25 Netzwerkprogrammierung und Cross–Plattform-Entwicklung
26 Paralleles Rechnen
27 Sicheres Programmieren
28 Wie geht’s jetzt weiter?
A Operatoren
B Die C-Standard-Bibliothek
Stichwort

Download:
- ZIP, ca. 10,6 MB
Buch bestellen
Ihre Meinung?

Spacer
<< zurück
C von A bis Z von Jürgen Wolf
Das umfassende Handbuch
Buch: C von A bis Z

C von A bis Z
3., aktualisierte und erweiterte Auflage, geb., mit CD und Referenzkarte
1.190 S., 39,90 Euro
Galileo Computing
ISBN 978-3-8362-1411-7
Pfeil 5 Basisdatentypen
Pfeil 5.1 Deklaration und Definition
Pfeil 5.2 Der Datentyp »int« (Integer)
Pfeil 5.3 Variablen verwenden
Pfeil 5.4 Der Datentyp »long«
Pfeil 5.5 Der Datentyp »long long«
Pfeil 5.6 Der Datentyp »short«
Pfeil 5.7 Ganzzahlige Typen mit vorgegebener Breite – <stdint.h>
Pfeil 5.7.1 <inttypes.h> (C99)
Pfeil 5.8 Die Gleitpunkttypen »float« und »double«
Pfeil 5.8.1 Gleitpunkttypen im Detail
Pfeil 5.8.2 »float« im Detail
Pfeil 5.8.3 »double« im Detail
Pfeil 5.8.4 long double
Pfeil 5.8.5 Einiges zu n-stelliger Genauigkeit
Pfeil 5.9 Numerische Gleitpunktprobleme
Pfeil 5.10 Komplexe Gleitpunkttypen – <complex.h>
Pfeil 5.11 Der Datentyp »char«
Pfeil 5.12 Nationale contra internationale Zeichensätze
Pfeil 5.13 Der Breitzeichen-Typ »wchar_t«
Pfeil 5.14 Multibyte-Zeichen
Pfeil 5.15 Boolescher Wert – <stdbool.h>
Pfeil 5.16 Vorzeichenlos und vorzeichenbehaftet
Pfeil 5.17 Limits für Ganzzahl- und Gleitpunktdatentypen
Pfeil 5.18 Der Typ »void«
Pfeil 5.19 Konstanten
Pfeil 5.19.1 Ganzzahlkonstanten
Pfeil 5.19.2 Gleitpunktkonstanten
Pfeil 5.19.3 Zeichenkonstanten
Pfeil 5.19.4 Stringliterale (Stringkonstante)
Pfeil 5.20 Umwandlungsvorgaben für formatierte Ein-/Ausgabe


Galileo Computing - Zum Seitenanfang

5.9 Numerische Gleitpunktprobleme topZur vorigen Überschrift

Vorsicht ist geboten vor Ungenauigkeiten durch die binäre Darstellung von Gleitpunktzahlen. Reelle Zahlen können im Gleitpunktformat nicht immer exakt dargestellt werden. Das liegt daran, dass die Gleitpunktsemantik so implementiert ist, wie es der Prozessor berechnet. Würde man dafür eine extra Funktion für den Compiler schreiben, wäre die Berechnungsdauer systemabhängig. Würde die Berechnung beispielsweise bei einem Pentium-Prozessor optimal ablaufen, könnte sie bei einem Athlon wiederum katastrophale Laufzeiten haben. Dadurch kann es bei der Berechnung von arithmetischen Ausdrücken zu Ungenauigkeiten kommen (wie weiter oben schon gezeigt wurde).


Achtung

Zahlen im Gleitpunktformat sollten nie auf Gleichheit überprüft werden!


Folgendes Programm wird in eine Endlosschleife laufen, da die Zahl 0.1 nie exakt dargestellt werden kann:

/* never_ending.c */
#include <stdio.h>

int main(void) {
   float i=0.0;
   for (i=0.0; i != 1.0; i += 0.1)
      printf("%f",i);
   return 0;
}

Sicherer ist es, wenn Sie dieses Beispiel so überprüfen:

/* equal_float.c */
#include <stdio.h>

int main(void) {
   float i=0.0;
   for (i=0.0; i < 0.9999 || i > 1.0001; i += 0.1)
      printf("%f",i);
   return 0;
}

Hinweis

Für Vergleiche von reellen Gleitpunktzahlen stehen auch Makros zur Verfügung. Mehr dazu können Sie in Abschnitt 20.3.6, »Makro zum Vergleich mit reellen Zahlen«, nachlesen.



Hinweis

Für den Fall, dass sich jemand näher mit der Gleitpunktdarstellung auf verschiedenen Systemen auseinandersetzen will (muss), hier ein Link dazu: http://cch.loria.fr/documentation/IEEE754/numerical_comp_guide/index.html


Natürlich kann ich jetzt nicht einfach schreiben, dass Sie sich in Acht nehmen sollen, wenn Sie Gleitpunktzahlen für Ihre Berechnungen verwenden, sondern hier wird wohl eine informatiker-gerechte Erklärung nötig sein. Zunächst mal möchte ich Ihnen das Gleitpunktformat beschreiben, das aus einem Vorzeichen, einem Dezimalbruch und einem Exponenten besteht:

+-f.fff x 10+-e

Zunächst finden Sie mit +- das Vorzeichen, gefolgt vom Dezimalbruch mit den vier Stellen f.fff und am Ende den Exponenten mit einer Stelle (+-e ). Die Zahlen werden gewöhnlich im E-Format (+-f.fffE+-e ) geschrieben. Zwar hat das IEEE das Gleitpunktformat standardisiert, aber leider halten sich nicht alle Computer daran. So wird beispielsweise die Zahl 1.0 wie im E-Format mit +1.000E+0 beschrieben oder –0.006321 mit –6.321E-3 und die 0.0 mit +0.000E+0.

So weit, so gut. Wenn Sie beispielsweise 2 /6 + 2 /6 rechnen, kommen Sie wohl auf das Ergebnis 4 /6. Richtig für Sie, aber hier geht das Dilemma Gleitpunktzahlen und Rundungsfehler schon los. 2 /6 ist im E-Format gleich +3.333E-1. Addieren Sie nun +3.333E-1 mit +3.333E-1, erhalten Sie als Ergebnis +6.666E-1 (bzw. 0.6666). Gut, aber leider falsch, denn 4 /6 sind im E-Format +6.667E-1, aber nicht wie berechnet +6.666E-1. Mit derartigen Rundungsfehlern haben viele Computer ihre Probleme.

Daher schon der erste Ratschlag: Sollten Sie eine Software entwickeln, mit der Geld verwaltet wird, und Sie wollen bzw. können dabei auf keine anderen Bibliotheken bzw. BCD-Arithmetiken zurückgreifen, dann sollten Sie die Beträge niemals im Gleitpunktformat verwenden (hierzulande also niemals mit Euro und Cent wie 1,99 €). Hier empfiehlt es sich, zur Berechnung die Geldbeträge in Cent als Integerzahl zu verwenden, da sonst bei immer intensiveren Berechnungen Rundungsfehler gemacht werden und somit eine falsche Berechnung garantiert ist.

Man kann nicht mal ganz genau sagen, wie genau eine solche gebrochene Zahl ist, weil dies von der Art der Berechnung abhängt. Beispielsweise führen Subtraktionen mehrerer ähnlicher Zahlen zu einem ungenaueren Ergebnis.


Hinweis

Um sich also mit den Problemen der Gleitpunktzahlen auseinanderzusetzen, müssen Sie sich mit Themen wie »numerischer Analyse« oder BCD-Arithmetik befassen. Allerdings sind dies Themen, die weit über dieses Buch hinausgehen würden.




Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.






<< zurück
  
  Zum Katalog
Zum Katalog: C von A bis Z

 C von A bis Z
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Einstieg in C++






 Einstieg in C++


Zum Katalog: C++ von A bis Z






 C++ von A bis Z


Zum Katalog: C/C++






 C/C++


Zum Katalog: Shell-Programmierung






 Shell-Programmierung


Zum Katalog: Linux-UNIX-Programmierung






 Linux-UNIX-
 Programmierung


Zum Katalog: IT-Handbuch für Fachinformatiker






 IT-Handbuch für
 Fachinformatiker


Zum Katalog: Ubuntu GNU/Linux






 Ubuntu GNU/Linux


Zum Katalog: Coding for Fun







 Coding for Fun 


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Galileo Press 2009
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de