Select the product you need help with
Umfassender Leitfaden zum Verständnis von IEEE-GleitkommafehlernArtikel-ID: 42980 - Produkte anzeigen, auf die sich dieser Artikel bezieht Dieser Artikel wurde zuvor veröffentlicht unter D44053 Dieser Artikel ist eine Übersetzung des folgenden englischsprachigen Artikels der Microsoft Knowledge Base: 42980
(http://support.microsoft.com/kb/42980/EN-US/
)
Titel des Originalartikels: (Complete) Tutorial to Understand IEEE Floating-Point ErrorsAuf dieser SeiteZusammenfassungDie Gleitkommamathematik ist ein äußerst komplexes Thema, das bei vielen Programmierern Verunsicherung erzeugt. Der folgende Leitfaden soll Ihnen helfen, Situationen beim Programmieren zu erkennen, in denen mit einer gewissen Wahrscheinlichkeit Gleitkommafehler auftreten können. Zudem erfahren Sie, wie Sie derartige Fehler vermeiden können. So lernen Sie auch, zwischen Fällen inhärenter Beschränkungen in Bezug auf die Gleitkommamathematik und tatsächlichen Kompilierfehlern zu unterscheiden. Weitere InformationenDezimal- und Binärsystem: Normalerweise legen wir beim Zählen von Dingen die Basis 10 zu Grunde. Diese Wahl der Basis 10 ist eigentlich völlig willkürlich. Ein einleuchtender Grund für ihre traditionelle Verwendung ist, dass wir zehn Finger haben, die wir ständig als Zählhilfen "zur Hand" haben. Die Zahl 532,25 im Dezimalsystem (Basis 10) hat die folgenden Bedeutung: Da es bei einer ganzen Zahl keine gebrochenen Bestandteile gibt, ist ihre Darstellung wesentlich einfacher als die von Gleitkommawerten. Normale ganze Zahlen sind auf Personalcomputern (PCs) 2 Byte (16 Bit) lang, wobei das wichtigere Bit das Vorzeichen bestimmt. Lange ganze Zahlen sind 4 Byte lang. Positive Werte sind einfach strukturierte Binärzahlen. Zum Beispiel: Komplikationen bei der Gleitkommarechnung: Jede dezimale ganze Zahl kann durch eine binäre ganze Zahl dargestellt werden; dies gilt jedoch nicht für gebrochene Zahlen. Tatsächlich wird jede Zahl, die im Dezimalsystem irrational ist, auch bei einer Basis kleiner als 10 irrational sein. Für Binärzahlen gilt insbesondere, dass nur gebrochene Zahlen, die in der Form p/q (wobei q eine ganzzahlige Potenz von 2 ist) dargestellt werden können, exakt mit einer endlichen Anzahl an Bits ausgedrückt werden können. Selbst gewöhnliche dezimale Brüche, wie die Dezimalzahl 0,0001, können nicht exakt als Binärzahl dargestellt werden. (0,0001 ist ein sich wiederholender (periodischer) binärer Bruch mit einer Periode von 104 Bits!) Nehmen wir das folgende einfache Beispiel Aus demselben Grund sollten Sie bei Vergleichen reeller Zahlen immer sehr vorsichtig sein. Das folgende Beispiel illustriert einen häufigen Programmierfehler: Zahlen im IEEE-Format: QuickBasic für MS-DOS, Version 3.0, wurde in einer MBF-Version (Microsoft Binary Floating Point) und einer IEEE-Version (IEEE= Institute of Electrical and Electronics Engineers) für Computer mit einem mathematischen Coprozessor ausgeliefert. QuickBasic für MS-DOS (Versionen 4.0 und höher) verwendet ausschließlich IEEE. Microsoft hat sich bei der Darstellung von Gleitkommawerten in den aktuellen Versionen von Basic aus den folgenden drei Hauptgründen für die IEEE-Norm entschieden:
Allgemeine Gleitkommakonzepte: Es ist sehr wichtig, sich vor Augen zu führen, dass jedes binäre Gleitkommasystem nur eine endliche Anzahl an Gleitkommawerten exakt darstellen kann. Alle anderen Werte sind Näherungswerte in Form des darstellbaren Wertes, der dem ursprünglichen Wert am nächsten liegt. Der IEEE-Standard spezifiziert das Verfahren zur Rundung von Werten auf den "nächstliegenden" darstellbaren Wert. QuickBasic für MS-DOS unterstützt diesen Standard und rundet den IEEE-Regeln entsprechend. Beachten Sie bitte auch, dass die Zahlen, die im IEEE-Format dargestellt werden können, einen sehr breiten Bereich abdecken. Sie können sich diese auf einer Art Zahlenlinie vorstellen. Nahe 1,0 und -1,0 gibt es eine hohe Dichte darstellbarer Zahlen, die jedoch immer mehr abnimmt, je mehr Sie sich 0 oder unendlich nähern. Das Ziel des für technische Berechnungen entwickelten IEEE-Standards ist eine maximale Genauigkeit (bestmögliche Annäherung an die tatsächliche Zahl). Genauigkeit bezieht sich hier auf die Anzahl der darstellbaren Stellen hinter dem Komma. Der IEEE-Standard versucht, eine Balance zwischen der Anzahl der Bits für den Exponenten und der Anzahl an Bits herzustellen, die der Darstellung des gebrochenen Teils einer Zahl dienen, um Präzision und Genauigkeit innerhalb akzeptabler Grenzen zu halten. IEEE-Details: Gleitkommazahlen werden in der folgenden Form dargestellt, wobei [Exponent] für den binären Exponenten steht:
Die Abweichung für Zahlen mit einfacher Genauigkeit ist 127 und für Zahlen mit doppelter Genauigkeit (zwei Stellen hinter dem Komma) beträgt sie 1023 (dezimal). Nur aus Nullen oder nur aus Einsen (binär) bestehende Werte sind für die Darstellung von Sonderfällen reserviert. Es gibt noch weitere Sonderfälle, die auf diverse Fehlerbedingungen hindeuten. Beispiele für Zahlen mit einfacher Genauigkeit: 2 = 1 * 2^1 = 0100 0000 0000 0000 ... 0000 0000 = 4000 0000 hex Beachten Sie bitte, dass das Vorzeichen-Bit null ist und der gespeicherte Exponent 128, oder 100 0000 0 im Binärsystem, was 127 plus 1 entspricht. Die gespeicherte Mantisse ist (1.) 000 0000 ... 0000 0000 mit einer impliziten führenden 1 und binärem Punkt, so dass die tatsächliche Mantisse 1 ist. -2 = -1 * 2^1 = 1100 0000 0000 0000 ... 0000 0000 = C000 0000 hex Wie bei +2, nur dass hier das Vorzeichen-Bit gesetzt ist. Dies gilt für alle Gleitkommazahlen im IEEE-Format. 4 = 1 * 2^2 = 0100 0000 1000 0000 ... 0000 0000 = 4080 0000 hex Dieselbe Mantisse, der Exponent erhöht sich um 1 (Abweichungswert 129 oder 100 0000 1 im Binärsystem). 6 = 1,5 * 2^2 = 0100 0000 1100 0000 ... 0000 0000 = 40C0 0000 hex Derselbe Exponent, die Mantisse ist um 0,5 größer -- also (1.) 100 0000 ... 0000 0000, was, weil es sich hier um einen binären Bruch handelt, 1-1/2 ist (die Werte für gebrochene Stellen sind 1/2, 1/4, 1/8, etc.). 1 = 1 * 2^0 = 0011 1111 1000 0000 ... 0000 0000 = 3F80 0000 hex Derselbe Exponent wie bei anderen Potenzen von 2, die Mantisse ist eins weniger als 2 bei 127, oder 011 1111 1 im Binärsystem. 0,75 = 1,5 * 2^-1 = 0011 1111 0100 0000 ... 0000 0000 = 3F40 0000 hex Der Exponent mit eingerechneter Abweichung ist 126, 011 1111 0 im Binärsystem, und die Mantisse ist (1.) 100 0000 ... 0000 0000, was 1-1/2 entspricht. 2,5 = 1,25 * 2^1 = 0100 0000 0010 0000 ... 0000 0000 = 4020 0000 hex Exakt wie 2, nur dass das Bit, das 1/4 repräsentiert, in der Mantisse gesetzt ist. 0,1 = 1,6 * 2^-4 = 0011 1101 1100 1100 ... 1100 1101 = 3DCC CCCD hex 1/10 ist im Binärsystem ein sich wiederholender (periodischer) Bruch. Die Mantisse liegt nur knapp unter 1,6 und der Exponent mit eingerechneter Abweichung besagt, dass 1,6 durch 16 dividiert werden soll (011 1101 1 im Binärsystem, was im Dezimalsystem 123 ist). Der wirkliche Exponent ist 123 - 127 = -4, was bedeutet, dass der Faktor, mit dem multipliziert werden muss, 2**-4 = 1/16 ist. Beachten Sie bitte, dass die gespeicherte Mantisse in ihrem letzten Bit aufgerundet ist. Dies ist ein Versuch, die eigentlich nicht darstellbare Zahl so exakt wie möglich darzustellen. (Der Grund dafür, dass 1/10 und 1/100 im Binärsystem nicht exakt dargestellt werden können, ähnelt der Ursache dafür, dass 1/3 im Dezimalsystem nicht exakt dargestellt werden kann.) 0 = 1,0 * 2^-128 = nur Nullen - ein Sonderfall. Sonstige häufig auftretende Gleitkommafehler:
Beispiel:Hinzuaddieren von 0,0001 zu 0,9900 (einfache Genauigkeit)Die Dezimalzahl 0,0001 wird dargestellt als:
Bitte beachten Sie: Bei diesem Artikel handelt es sich um eine Übersetzung aus dem Englischen. Es ist möglich, dass nachträgliche Änderungen bzw. Ergänzungen im englischen Originalartikel in dieser Übersetzung nicht berücksichtigt sind. Die in diesem Artikel enthaltenen Informationen basieren auf der/den englischsprachigen Produktversion(en). Die Richtigkeit dieser Informationen in Zusammenhang mit anderssprachigen Produktversionen wurde im Rahmen dieser Übersetzung nicht getestet. Microsoft stellt diese Informationen ohne Gewähr für Richtigkeit bzw. Funktionalität zur Verfügung und übernimmt auch keine Gewährleistung bezüglich der Vollständigkeit oder Richtigkeit der Übersetzung. EigenschaftenArtikel-ID: 42980 - Geändert am: Mittwoch, 24. August 2005 - Version: 2.2 Die Informationen in diesem Artikel beziehen sich auf:
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.
| SPRACHE AUSWÄHLEN
|



Zum Anfang








