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 ]