Frage deutsch
~~~~~~~~~~~~~~
Was sind Gleitpunktzahlen und wie gehe ich damit um?
Question English
~~~~~~~~~~~~~~
What are floating-point numbers and can I handle them?
Antwort 1
~~~~~~~~
[ von Thomas Antoni und Helium ( m.beckah*gmx.de ); 20.5.2002 -
7.6.2002 ]
*** wie ist eine Gleitpunktzahl im Prinzip aufgebaut
Eine Gleitpunktzahl (auch "Fließkomma-Zahl", englisch "floating-point number"
oder "real number" genannt) ist eine Zahl mit einer variablen Position des
Dezimalpunktes. Eine Gleitpunktzahl hat zwei Bestandteile: Die eigentliche Wert
wird durch die sogenannten "Mantisse" dargestellt und die Position des
Dezimalpunktes durch den "Exponenten".
Hiermit lassen sich reelle Zahlen darstellen, wobei sich periodische Brüche
aufgrund der endlichen Länge der Mantisse nur mit Rundungsfehlern ablegen und
anzeigen lassen. 1/3 wird z.B. zu 0,33333330 .
Starte mal die folgende Befehlszeile in der QBasic-Entwicklungsumgebung
:
PRINT 1!/2400000!
Der -> Suffix "!" kennzeichnet eine einfach
lange 32 Bit Gleitpunktzahl (Datentyp SINGLE) mit einer Mantisse von 7
Dezimalstellen
Du erhältst die folgende Anzeige
4.166667 E-07
Du siehst hier die 7-stellige Mantisse 4.166667 und den Exponenten E-07. Das
ganze ist gleichbedeutend mit
4,166667 x 10 ^ -7 , also 0,0000004166667 .
Wenn sich das Ergebnis innerhalb der in der Mantisse verfügbaren 7 Stellen
darstellen lässt, wird in der Bildschirmanzeige der Exponent zur besseren
Lesbarkeit weggelassen und der Dezimalpunkt an die korrekte Stelle gesetzt.
Die Befehlszeile
PRINT 1234!/100!
ergibt beispielsweise die Anzeige
12.34
In der Exponenzialdarstellung befindet sich der Dezimalpunkt übrigens
grundsätzlich immer hinter der ersten Stelle (der Einerstelle) .
*** Die Gleitpunkt-Datentypen bei QBasic
Bei QBasic gibt es die beiden Datentypen SINGLE (Variablennamen z.B. "egon!"
oder "egon") und DOUBLE (Variablenname z.B. "paul#").
In meinem QBasic-Kochbuch findest Du zu SINGLE und DOUBLE die folgenden
Information.
- egon! : SINGLE, einfach lange Gleitpunktzahl
(32 Bit, 7 Dezimalstellen Mantisse)
Wertebereich +-2,802597 *10^-45...+-3,402823 *10^38
- egon : dito (Suffix "!" ist bei SINGLE-Variablen weglassbar)
- paul# : DOUBLE, doppelt lange Gleitpunktzahl
(64 Bit, 16 Dezimalstellen Mantisse)
+-4,446590812571219 *10^-323...+-1,79769313486231 *10^308
Das QBasic-Kochbuch steht in der Tutorial-Rubrik von www.qbasic.de
zum Download bereit.
Wenn man den -> Suffix " ! " oder " # " hinter dem
Variablennamen weglässt, dann ordnet QBasic der Variablen automatisch den Typ
SINGLE zu. Wenn für eine Berechnung der Datentyp -> Integer (Ganzzahl) ausreicht, solltest Du im Variablennamen immer den zugehörigen
Suffix " % " oder " & " verwenden, weil die Gleitpunktverarbeitung erheblich
mehr Rechenleistung verbraucht als die Integerarithmetik.
-> PowerBasic unterstützt übrigens
zusätzlich noch EXTENDED Gleitpunktzahlen mit einer Datenlänge von 80 Bits.
Bei der Arithmetik mit Gleitpunktzahlen sind Rundungsfehler nicht immer
ververmeidbar. Siehe dazu den Eintrag "Warum kommt es bei Gleitpunktoperationen zu Rundungsfehlern?"
in der Kategorie "Zahlen verarbeiten ..." .
*** Interne Darstellung von Gleitpunktzahlen
Im Computer werden die Gleitpunktzahlen natürlich als 0/1-Kombinationen
hinterlegt und verarbeitet, wobei ein Teil des 32 bzw. 64 Bit langen Bitfeldes
für die Mantisse und der Rest für den Exponenten reserviert ist. Der Exponent
bezieht sich natürlich in Wirklichkeit auf die Basis 2 und nicht nicht wie oben
angegeben auf die Basis 10. Die Dezimaldarstelung existiert nur auf der
Anwenderoberfläche, nicht intern in der CPU.
Intern werden die Gleitpunktzahlen also wie folgt abgelegt:
Vorzeichen x Mantisse x 2 ^ (Vorzeichen x Exponent)
Außerdem speichern solche Zahlen für gewöhnlich auch noch Sonderzustände, wie
keine Zahl (NAN, not a number) oder Unendlich (INF, infinity)
1.0 / 0 = INF
-1.0 / 0 = -INF
Wie die Gleitpunktzahlen intern dargestellt sind, braucht den Programmierer
normalerweise nicht zu interssieren. Erst wenn externe Bibliotheken verwendet
werden die z.B. in C/C++ oder Assembler geschrieben sind, muss man sich darum
kümmern, dass die Gleitpunktformate -> kompatibel sind. Bis
QuickBasic 3.0 gab es bei Microsoft das spezielle MBF-Format für die
Gleitpunktzahlen. Erst ab QuickBasic 3.0 wechselte Microsoft zum heute am
häufigsten verwendeten IEEE-Format (sprich "ai-trippel-ie").
In "Antwort 2" erhältst Du dazu detaillierte Informationen.
*** Die Gleitpunktformate IEEE und MBF
Zu dieser Thematik der folgende Beitrag aus der Newsgroup news:comp.lang.basic.misc :
MBF stands for Microsoft Binary Format which is an
alternate Floating Point Format to the IEEE 747 standard formats. It was
commonly used in the 70's and may be run across in old software/data files. More
information on the format can be retrieves from http://www.borland.com
or ftp.borland.com
along with C source code to convert between
the two. Perhaps Peter will translate in the Code FAQ for uses of other Basics.
The Microsoft Binary Format was given up for the IEEE formats because its
accuracy was not as good and to comply with the Intel 80x87 FPU for faster
calculations using the FPU (Floating-Point Unit).
*** Nutzt QBasic den Mathematischen Coprozessor?
Ab dem 486er Prozessor haben alle Intel CPUs einen integrierten
Mathematischen -> Coprozessor, der die
Gleitpunktoperation hardwaremäßig und daher sehr schnell abarbeitet. Bei den
Vorgänger-CPUs gab die speziellen Coprozessoren 8087, 80287 und 80387 als
getrennte Chips.
QBasic erkennt leider nur die externen Coprozessoren 8087 bis 80387, nicht
jedoch die On-Chip-Copros moderner CPUs ab. Die die Gleitpunktarithmetik wird
dort daher sehr, sehr langsam per Software -> emuliert .
Es gibt jedoch ein kleines Progrämmchen namens FFIX.COM , das den Numerischen
Coprozessor für QBasic aktiviert, wenn man es vor dem Start des QBasic-Programms
aufruft. Weitere Informationen über FFIX.COM findest Du im Beitrag
"Wie kann mein QB-Programm den
Arithmetik-Coprozessor nutzen?" in der
Kategorie "Sonstiges"
.
*** Allgemeine Informationen zu Gleitpunktzahlen
Eine Gleitpunktzahl, ist eine Zahl,die durch eine Mantisse und einen
Exponenten entsprechend einer vorgegebenen Basis dargestellt wird. Die Mantisse
hat in der Regel einen Wert zwischen 0 und 1. Um den Wert einer Gleitkomma-Zahl
zu ermitteln, wird die Basis mit dem Exponenten potenziert und die Mantisse mit
dem Ergebnis multipliziert. Entsprechend der konventionellen Notation werden
Gleitkomma-Zahlen mit dem Wert 10 als Basis verwendet. In der Informatik hat die
Basis für Gleitkomma-Zahlen in der Regel den Wert 2.
Die "Gleitpunkt-Notation" (engl. "floating-point notation") wird auch als
"Exponenzial-Schreibweise" bezeichnet. Es handelt sich dabei um ein numerisches
Format, das sich für die Darstellung sehr großer und sehr kleiner Zahlen eignet.
Die Speicherung von Gleitpunkt-Zahlen erfolgt in zwei Teilen - Mantisse und
Exponent. Die Mantisse legt dabei die einzelnen Ziffern der Zahl fest, und der
Exponent gibt deren Größenordnung (d.h. die Position des Dezimalpunkts) an.
Beispielsweise lassen sich die Zahlen 314600000 und 0,0000451 in
Gleitkomma-Notation als 3146E5 und 451E-7 schreiben. Viele Mikroprozessoren
können keine Gleitkomma-Arithmetik ausführen, so daß man entsprechende
Berechnungen entweder per Software nachbildet oder einen speziellen
Gleitkomma-Prozessor einsetzt.
Zum Thema "Gleitkommazahlen allgemein" erhältst Du weitere Infos in der
Online-Enzyklopädie Wikipedia unter http://de.wikipedia.org/wiki/Gleitkommazahl
Zu dem Thema "Gleitkommazahlen in QBasic" gibt es erschöpfende
Informationen
auf Andreas Meiles Webseite unter
http://dreael.catty.ch/Deutsch/BASIC-Knowhow-Ecke/Gleitkommazahlen.html
Antwort 2
~~~~~~~~~~
[ aus der Microsoft Knowlede Base auf http://www.microsoft.de ]
List of Basics Using MBF versus IEEE Floating-Point Format (Q11936)
SUMMARY
This article lists which Basic versions (for MS-DOS) use Microsoft Binary
Format (MBF) and which versions use IEEE format for storing single- and
double-precision floating-point numbers.
MORE INFORMATION
Single- and double-precision real numbers are stored in the Microsoft Binary
Format (MBF) in the following languages:
QuickBasic versions 1.00, 1.01, 1.02, 2.00, 2.01, and the non-coprocessor
QB.EXE version 3.00, for MS-DOS
IBM and Compaq BasicA Interpreters (BasicA.COM) for MS-DOS
GW-Basic Interpreter versions 3.20, 3.22, and 3.23 (GWBasic.EXE) for MS-DOS
Microsoft Basic Interpreter version 5.28 for MS-DOS
Microsoft Basic Compiler versions 5.35 and 5.36 for MS-DOS
QuickBasic versions 4.00, 4.00b, and 4.50 (QB.EXE, BC.EXE) and the
coprocessor version of QuickBasic version 3.00 (QB87.EXE) use IEEE
floating-point format for single- and double-precision real numbers.
Note that Microsoft Business Basic Compiler versions 1.00 and 1.10 use a
different floating-point format called Decimal Math. Decimal Math is very slow
but has no rounding or representation errors because numbers are stored in their
exact decimal form, instead of in an approximate binary form. (Sales of Business
Basic were discontinued.)
In QuickBasic version 3.00, the coprocessor version of QuickBasic uses IEEE
format numbers. Conversion routines are provided in version 3.00 to convert
between the MBF used in the non-coprocessor version (QB.EXE) and the IEEE
floating-point format used in the coprocessor version (QB87.EXE).
QuickBasic versions 4.00, 4.00b, and 4.50; Microsoft Basic Compiler versions
6.00 and 6.00b; and Microsoft Basic Professional Development System (PDS)
versions 7.00 and 7.10 only use IEEE format numbers, but conversion routines and
a compiler switch are provided to convert between MBF and IEEE format. This
conversion is necessary if you want to retrieve floating-point numbers from
random access files that were created using MBF.
REFERENCES
For additional articles that discuss MBF and IEEE, search for the following
words:
floating and point and format and QuickBasic
Antwort 3
~~~~~~~~~~
[ aus der Microsoft Knowlede Base auf http://www.microsoft.de ]
Titel des Originalartikels: Q42980: Titel des Originalartikels: (Complete)
Tutorial to Understand IEEE Floating-Point Errors
Die Informationen in diesem Artikel beziehen sich auf:
Microsoft Visual Basic Standard und Professional Edition für Windows,
Versionen 2.0, 3.0, 4.0
Microsoft Visual Basic Standard und Professional Edition für MS-DOS, Version
1.0
Microsoft QuickBASIC für MS-DOS, Versionen 4.0, 4.0b, 4.5
Microsoft Basic Compiler für MS-DOS und MS OS/2, Versionen 6.0 und 6.0b
Microsoft Basic Professional Development System für MS-DOS, Versionen 7.0,
7.1
*** Zusammenfassung:
Die 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 Informationen:
Dezimal- 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:
(5 * 10^2) + (3 * 10^1) + (2 * 10^0) + (2 * 10^-1) + (5 * 10^-2)
500 + 30 + 2 + 2/10 + 5/100
_________
= 532,25
Im Binärsystem (Basis 2) repräsentiert jede Spalte eine Potenz von 2 statt
einer Zehnerpotenz. So hat zum Beispiel die Zahl 101.01 im Binärsystem die
folgende Bedeutung:
(1 * 2^2) + (0 * 2^1) + (1 * 2^0) + (0 * 2^-1) + (1 * 2^-2)
4 + 0 + 1 + 0 + 1/4
_________
= 5,25 (dezimal)
*** Darstellung ganzer Zahlen durch PCs:
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:
1 dezimal = 1 binär
2 dezimal = 10 binär
22 dezimal = 10110 binär, etc.
Bei negativen ganzen Zahlen wird hingegen das Zweierkomplementschema
verwendet. Um zu der Zweierkomplementdarstellung einer negativen Zahl zu
gelangen, nehmen Sie die binäre Darstellung für den Absolutwert der Zahl,
spiegeln alle Bits und fügen dann 1 hinzu. Zum Beispiel:
4 dezimal = 0000 0000 0000 0100
1111 1111 1111 1011 Bits spiegeln
-4 = 1111 1111 1111 1100 1 hinzufügen
Beachten Sie bitte, dass -1 Dezimal = 1111 1111 1111 1111 im Binärsystem ist,
was erklärt, warum Basic -1 als logisch wahr behandelt (alle Bits = 1). Dies ist
eine Konsequenz daraus, dass es keine separaten Operatoren für bitweise und
logische Vergleiche gibt. In Basic ist es oft empfehlenswert, das folgende
Codefragment zu verwenden, wenn Ihr Programm logische Vergleiche ausführen soll.
Dadurch wird die Lesbarkeit erheblich verbessert.
CONST TRUE = -1
CONST FALSE = NOT TRUE
Beachten Sie bitte, dass bei der Addition zweier Zweierkomplementzahlen unter
Verwendung normaler binärer Arithmetik das Resultat korrekt ist.
*** 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
SUM = 0
FOR I% = 1 TO 10000
SUM = SUM + 0.0001
NEXT I%
PRINT SUM ' Theoretisch = 1,0.
bei dem das AUSGEDRUCKTE Ergebnis 1,000054 lautet. Diese kleine Abweichung
bei der Darstellung von 0,0001 im Binärsystem kann bei Additionen einen
erheblichen Einfluss auf die Gesamtsumme haben.
Aus demselben Grund sollten Sie bei Vergleichen reeller Zahlen immer sehr
vorsichtig sein. Das folgende Beispiel illustriert einen häufigen
Programmierfehler:
item1# = 69.82#
item2# = 69.20# + 0.62#
IF item1# = item2# then print "Equality!"
Das DRUCKERGEBNIS wird in diesem Fall eben nicht "gleich" sein, weil 69,82 im
Binärsystem nicht exakt dargestellt werden kann, was dazu führt, dass der Wert
(im Binärsystem) etwas von dem Wert abweicht, der durch den Ausdruck der
Funktion generiert wird. In der Praxis sollten Sie solche Vergleiche immer so
codieren, dass Raum für gewisse Toleranzen besteht. Zum Beispiel:
IF (item1# < 69.83#) AND (item1# > 69.81#) then print
"Equal"
Hier ist der AUSGEDRUCKTE Wert "gleich" (Equal).
*** 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:
1. Damit Basic mit mathematischen Coprozessoren von Intel arbeiten kann, die
das IEEE-Format verwenden. Die Intel-Coprozessoren der Baureihe 80x87 können
keine Zahlen im Microsoft-Binärformat verarbeiten.
2. Um programmiersprachenübergreifende Aufrufe zwischen Basic, C, Pascal,
FORTRAN und MASM wesentlich zu erleichtern. Andernfalls müssten
Konvertierungsroutinen eingesetzt werden, um numerische Werte von einer
Programmiersprache in eine andere zu übertragen.
3. Um die Konsistenz zu gewährleisten. IEEE ist der allgemein akzeptierte
Standard für C- und FORTRAN-Kompilierprogramme.
Nachstehend sehen Sie einen Vergleich der IEEE- und MBF-Darstellungen einer
Zahl mit doppelter Genauigkeit:
Vorzeichen-Bits Exponenten-Bits Mantissen-Bits
IEEE 1 11 52 + 1 (implizit)
MBF 1 8 56
Weitere Informationen zu den Unterschieden zwischen der IEEE- und der
MBF-Gleitkommadarstellung finden Sie in der Microsoft Knowledge Base, wenn Sie
nach folgenden Begriffen suchen:
IEEE; floating; point; appnote
Beachten Sie bitte, dass bei IEEE mehr Bits auf den Exponenten entfallen,
wodurch ein breiterer Bereich von Werten dargestellt werden kann. MBF hat mehr
Mantissen-Bits, was in einem engeren Bereich eine größere Präzision ermöglicht.
*** 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:
X = Bruch * 2^(Exponent - Abweichung)
[Bruch] steht für den normalisierten gebrochenen Teil der Zahl; normalisiert,
weil der Exponent so angepasst wird, dass das führende Bit immer gleich ist.
1. So muss dieses Bit nicht gespeichert werden, Ihnen steht also ein Bit mehr
für die Genauigkeit zur Verfügung. Aus diesem Grund gibt es ein implizites Bit.
Sie können sich dies wie bei der wissenschaftlichen Notation vorstellen, bei der
Sie den Exponenten so manipulieren, dass Sie eine Stelle links vom Komma
erhalten. Im Binärsystem können Sie den Exponenten immer so manipulieren, dass
das erste Bit eine 1 ist, da es nur Einsen und Nullen gibt.
[Abweichung] ist der Abweichungswert, der verwendet wird, um die
Notwendigkeit zur Speicherung negativer Exponenten zu umgehen.
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:
1. Abrundungsfehler
Dieser Fehler tritt auf, wenn alle Bits in einer binären Zahl nicht in einer
Berechnung verwendet werden können.
Beispiel: Hinzuaddieren von 0,0001 zu 0,9900 (einfache Genauigkeit)
Die Dezimalzahl 0,0001 wird dargestellt als:
(1.)10100011011011100010111 * 2^(-14+Abweichung) (13 führende Nullen im
Binärsystem!)
0,9900 wird dargestellt als:
(1.)11111010111000010100011 * 2^(-1+Abweichung)
Um diese Zahlen jetzt tatsächlich zu addieren, müssen die dezimalen (binären)
Punkte ausgerichtet werden. Hierzu müssen sie denormalisiert werden. Die daraus
resultierende Addition sieht wie folgt aus:
.000000000000011010001101 * 2^0 <- Nur 11 von 23 Bits werden
beibehalten
+0,111111010111000010100011 * 2^0
________________________________
0,111111010111011100110000 * 2^0
Man bezeichnet dies als Abrundungsfehler, weil manche Computer beim
Verschieben zwecks Addition runden, während andere Computer die Zahlen einfach
abschneiden. Abrundungsfehler sind besonders dann zu berücksichtigen, wenn zwei
sehr verschiedene Werte addiert oder miteinander multipliziert werden.
2. Subtrahieren zweier fast gleicher Werte
0,1235
-0,1234
_____
0,0001
Dieser Wert wird normalisiert. Beachten Sie bitte, dass die ursprünglichen
Zahlen jeweils vier signifikante Stellen hatten, das Ergebnis aber nur noch eine
signifikante Stelle aufweist.
3. Überlauf und Unterlauf:
Zu diesen Fehlerbedingungen kommt es, wenn das Ergebnis zu groß oder zu klein
ist, um durch den jeweiligen Datentyp dargestellt werden zu können.
4. Quantisierungsfehler:
Diese Fehler treten bei solchen Zahlen auf, die durch den Gleitkommastandard
nicht exakt dargestellt werden können.
5. Division durch eine sehr kleine Zahl:
Ein solcher Vorgang kann einen Fehler des Typs "Division durch null" auslösen
oder zu fehlerhaften Ergebnissen führen, wie in dem folgenden Beispiel:
A = 112000000
B = 100000
C = 0,0009
X = A - B / C
In QuickBasic für MS-DOS hat X jetzt den Wert 888887 statt der korrekten
Antwort 900000.
6. Ausgabefehler:
Dieser Typ von Fehler tritt auf, wenn die Ausgabefunktionen die Werte ändern,
mit denen sie arbeiten.
REFERENCES
For more information on floating-point mathematics, consult the following
references:
Stark, Peter A. "Introduction to Numerical Methods." McMillan Publishing,
1970.
Forsythe, George E; Malcolm, Moler. "Computer Methods for Mathematical
Computations." Prentice-Hall, 1977.
For further information on the topics covered in this article, consult the
following reference books:
Hergert, Douglas. "Microsoft Quickbasic Developing Structured Programs in the
Microsoft QuickBasic Environment." Microsoft Press, 1989.
Wilton, Richard. "Programmer's Guide to PC & PS/2 Video Systems."
Microsoft Press, 1987.
Norton, Peter. "The New Peter Norton Programmer's Guide to the IBM PC &
PS/2." Microsoft Press, 1985.
Duncan, Ray. "Advanced MS-DOS Programming." Microsoft Press, 1988.
Clark Craig, John. "Microsoft QuickBasic Programmer's Toolbox." Microsoft
Press, 1988
Answer 3
~~~~~~~~~~~~~
[ from the QB-Forum at www.network54.com/Forum/ ]
*** Question
What is the binary representaion of floating point numbers?
*** Answer
Going left from the decimal, the place values double each time, so it would
make sense that going right from the decimal, the place values halve(sp?) each
time.
3.625 = 11.101 (2 + 1 + .5 + 0 + .125)
Of course a computer can't store decimal points, so if you're interested in
the format of the floating-point variable, here it is.
There are 3 parts to a fp: the sign bit (highmost/leftmost bit), exponent,
and mantissa. The exponent is 8/11 bits and the mantissa is 23/52 for
single/double-percision.
FP values are stored in a scientific-notation-like format. The mantissa is
the binary number with the decimal shifted so it is a value between 1 and 2
(1.1101 in the above). For a value to be between 1 and 2, the value to the left
of the decimal must always be 1. Since it is always 1, it doesn't have to be
stored in the byte, we can "assume it is 1" (hence the name "assumed bit").
So, the mantissa is 1101 in this case. (trailing zeros would follow to fill
the 23/52 bits) As for the exponent, We moved the decimal to the left one, so
the exponent is 1. However, the 8/11 bits for the exponent also has to account
for negative exponents (moving the decimal to the right), so you take
127+exponent:
3.625 = 0 10000000 11010000000000000000000
So the nu
mber is positive (signbit=0), the exponent is 128, and the mantissa is that
long number, heh.
[ The QBasic-MonsterFAQ --- Start Page: www.antonis.de/faq ]