(Abgeschlossen) Tutorial zu verstehen, IEEE-Gleitkomma-Fehler

Veralteter Haftungsausschluss für KB-Inhalte

Dieser Artikel wurde für Produkte geschrieben, für die Microsoft keinen Support mehr anbietet. Deshalb wird dieser Artikel im vorliegenden Zustand bereitgestellt und nicht mehr aktualisiert.

Zusammenfassung

Gleitkommazahlen Mathematik ist ein komplexes Thema, das viele Programmierer verwirrt. Der Anleitung unten können Sie die Programmierung Situationen, Gleitkommazahlen Fehler auftreten und Vermeiden von erkennt. Sie dürfte Fällen erkennen, die inhärente Gleitkommaoperationen Nachteile gegenüber aktuelle Compiler-Fehler verursacht werden.

Weitere Informationen

Decimal und binären Zahlensysteme

Normalerweise zählen Dinge Basis 10. Die Basis ist völlig willkürlich. Der einzige Grund, dass Personen Basis 10 traditionell verwendet haben ist, dass sie 10 Finger die praktischen zählen Tools gemacht haben.


Die Zahl 532.25 im Dezimalsystem (Basis 10) bedeutet Folgendes:

   (5 * 10^2) + (3 * 10^1) + (2 * 10^0) + (2 * 10^-1) + (5 * 10^-2)
500 + 30 + 2 + 2/10 + 5/100
_________
= 532.25


Jede Spalte stellt im Binärsystem (Basis 2) eine Potenz von 2 statt 10. Beispielsweise bedeutet die Zahl 101.01 Folgendes:

   (1 * 2^2) + (0 * 2^1) + (1 * 2^0) + (0 * 2^-1) + (1 * 2^-2)
4 + 0 + 1 + 0 + 1/4
_________
= 5.25 Decimal


Darstellung von Ganzzahlen in PCs

Ist keine Nachkommastellen in eine ganze Zahl, ist die Computer Darstellung einfacher als Gleitkommawerte werden. Normale Zahlen Personal Computer (PCs) sind 2 Bytes (16 Bits) mit das wichtigste Bit die Vorzeichen angibt. Sind 4 Byte lange ganze Zahlen. Positive Werte sind einfache binäre Zahlen. Beispiel:

    1 Decimal = 1 Binary
2 Decimal = 10 Binary
22 Decimal = 10110 Binary, etc.


Negative Ganzzahlen werden jedoch die beiden Ergänzung Schema dargestellt. Um die beiden Ergänzung Darstellung einer negativen Zahl zu erhalten, nehmen Sie die Binärdaten für die Absolute Zahl spiegeln Sie die Bits und fügen Sie 1 hinzu. Beispiel:

   4 Decimal = 0000 0000 0000 0100
1111 1111 1111 1011 Flip the Bits
-4 = 1111 1111 1111 1100 Add 1


Beachten Sie-1 Dezimal = 1111 1111 1111 1111 binär, die erklärt, warum Basic-1 als logische True behandelt (alle Bits = 1). Dies ist eine Folge nicht getrennte Operatoren für bitweise und logische Vergleiche. In Basic ist es oft mit dem Codefragment unten bei Ihrem Programm viele logische Vergleiche machen. Dies erleichtert erheblich Lesbarkeit.

   CONST TRUE = -1
CONST FALSE = NOT TRUE


Notiz, die eine beliebige Kombination von zwei hinzufügen zusammen mit normalen binäre Arithmetik ergänzen erzeugt das richtige Ergebnis.

Gleitkommazahlen Komplikationen

Jede Dezimalzahl kann durch einen binären ganzzahligen exakt dargestellt werden; Dies gilt jedoch nicht für Bruchzahlen. Tatsächlich wird jede Zahl unvernünftig Basis 10 auch unvernünftig in jedem System mit weniger als 10 sein.


Für binäre können insbesondere nur gebrochene Zahlen im Formular p/Q dargestellt werden können, wobei q ganzzahlige Potenz von 2 ist, genau mit einer begrenzten Anzahl von Bits ausgedrückt werden.


Selbst häufig vorkommende Dezimalbrüche wie 0,0001 können binäre dargestellt werden. (0,0001 ist ein Binärbruch mit 104 Bit!)


Deshalb beispielsweise wie folgt

   SUM = 0
FOR I% = 1 TO 10000
SUM = SUM + 0.0001
NEXT I%
PRINT SUM ' Theoretically = 1.0.


Drucken 1.000054 ausgegeben wird. Kleine Fehler 0,0001 binär Binärsystem summiert.


Aus demselben Grund sollten Sie immer sehr vorsichtig sein beim Vergleich für reelle Zahlen. Das folgende Beispiel veranschaulicht einen gängiger Programmierfehler:

   item1# = 69.82#
item2# = 69.20# + 0.62#
IF item1# = item2# then print "Equality!"


Dies DRUCKT nicht "Gleichheit!" da 69.82 binäre, wodurch den Wert, der aus der Zuordnung zu geringfügig (im Binärcode) nicht dargestellt werden kann als der Wert im Ausdruck generiert wird. In der Praxis sollten Sie immer derartige Vergleiche so einige Toleranz kann code. Beispiel:

   IF (item1# < 69.83#) AND (item1# > 69.81#) then print "Equal"


So drucken Sie "Gleich".

IEEE Formatieren von Zahlen

QuickBasic für MS-DOS, Version 3.0 wurde mit einem MBF (Microsoft Binary Floating Point) und einer IEEE (Institute of Electrical and Electronics Engineers) Version für Computer mit einem mathematischen Coprozessor ausgeliefert. QuickBasic für MS-DOS-Versionen 4.0 und höher verwenden nur IEEE. Microsoft hat beschlossen, IEEE-Standard Gleitkommawerte in aktuellen Versionen von Basic drei primären Ursachen darstellen:

  1. Basic verwenden die Mathematische Coprozessoren von Intel, IEEE-Format verwenden können. Intel 80 x 87-Serie Coprozessoren können nicht mit Microsoft-Binärformat arbeiten.
  2. Zu interimsprache zwischen Basic, C, Pascal, FORTRAN und MASM einfacher aufrufen. Andernfalls müssten Konvertierungsroutinen verwendet werden, um numerische Werte aus einer Sprache in eine andere zu senden.
  3. Um Konsistenz zu erreichen. IEEE ist anerkannten Industriestandard für C und FORTRAN-Compiler.
Im folgenden finden einen schnellen Vergleich der IEEE und MBF Darstellung für eine Zahl mit doppelter Genauigkeit:

               Sign Bits   Exponent Bits   Mantissa Bits
--------- ------------- -------------
IEEE 1 11 52 + 1 (Implied)
MBF 1 8 56


Weitere Informationen zu den Unterschieden zwischen IEEE und MBF Gleitkomma Darstellung Abfrage in der Microsoft Knowledge Base nach folgenden Begriffen:

   IEEE and floating and point and appnote


Beachten Sie, dass IEEE mehr Bits gewidmet Exponent, ermöglicht es, einen größeren Wertebereich darstellen. MBF hat mehr Mantissenbits, wodurch es genauer innerhalb der schmaler

Allgemeine Konzepte Gleitkomma

Es ist sehr wichtig zu beachten, dass jedes binäre Gleitkomma System nur eine begrenzte Anzahl von Gleitkommawerten im Formular darstellen kann. Alle Werte müssen den nächsten darstellbaren Wert angenähert werden. Der IEEE-Standard gibt die Methode für die Werte "nächstliegende" darstellbaren Wert gerundet. QuickBasic für MS-DOS-Standard unterstützt und gemäß IEEE rundet.


Auch dabei, die Zahlen, die in IEEE dargestellt werden können auf vielfältige verteilt sind. Sie können auf eine Position angenommen werden. Es gibt eine hohe Dichte darstellbare Anzahl 1.0 und -1.0 aber weniger wie 0 oder unendlich.


Die IEEE-Norm engineering Berechnungen vorgesehen ist, soll Genauigkeit (zu so nah wie möglich an der Zahl). Genauigkeit bezieht sich auf die Anzahl der Ziffern dargestellt werden können. Das IEEE-standard versucht, die Anzahl der Bits für den Exponenten mit der Anzahl der Bits zum Kommastellen der Zahl, Genauigkeit und Präzision innerhalb akzeptabler Grenzen zu verteilen.

IEEE-Details

Gleitkommazahlen werden in der folgenden Form dargestellt, wobei [Exponent] den binären Exponenten steht:

   X =  Fraction * 2^(exponent - bias)


[Bruch] ist normalisierte Nachkommastellen der Zahl; der Exponent so angepasst wird, dass das führende Bit immer eine 1 ist. Dadurch keinen gespeichert werden und Sie erhalten ein weiteres Bit Genauigkeit. Deshalb gibt es ein implizites Bit. Kann man dieses wie wissenschaftliche Notation, der Exponent müssen eine Ziffer links vom Dezimalkomma, außer binär Exponenten immer bearbeiten können, so dass das erste Bit 1, ist nur 1 und 0.


[Verschiebung] ist der Biaswert verwendet, um speichern negative Exponenten zu vermeiden.


Die Verschiebung für Zahlen einfacher Genauigkeit ist 127 und 1023 (dezimal) für Zahlen mit doppelter Genauigkeit.


Die Werte gleich alle 0 und alle 1 (binär) sind für Sonderfälle darstellt. Es gibt andere Sonderfälle, die verschiedenen Fehler hinzuweisen.

Beispiele für Genauigkeit

2 = 1 * 2 ^ 1 = 0100 0000 0000 0000... 0000 0000 = 4000 0000 hex
Beachten Sie das Vorzeichenbit NULL, und der gespeicherte Exponent 128 oder 100 0000 0 binär 127 plus 1 entspricht. Die gespeicherte Mantisse ist (1) 000 0000... 0000 0000, hat einen impliziten führenden 1 und Punkt also die tatsächliche Mantisse 1.

-2 =-1 * 2 ^ 1 = 1100 0000 0000 0000... 0000 0000 = C000 0000 Hex
Entspricht + 2, außer dass das Vorzeichenbit gesetzt ist. Dies gilt für alle IEEE Format Gleitkommazahlen.

4 = 1 * 2 ^ 2 = 0100 0000 1000 0000... 0000 0000 = 4080 0000 hex
Dieselbe Mantisse erhöht Exponent (gewichteter Wert ist 129 bzw. binär 100 0000 1.

6 = 1,5 * 2 ^ 2 = 0100 0000 1100 0000... 0000 0000 = 40C 0 0000 hex
Derselbe Exponent Mantisse Hälfte größer ist es (1) 100 0000... 0000 0000, da dies ein Binärbruch ist 1 1/2 (die Werte der Bruchzahlen sind 1/2, 1/4, 1/8 usw..).

1 = 1 * 2 ^ 0 = 0011 1111 1000 0000... 0000 0000 = 3F80 0000 hex
Derselbe Exponent wie bei anderen Potenzen von 2 Mantisse ist weniger als 2 bei 127 bzw. binär 011 1111 1.

.75 = 1,5 * 2 ^-1 = 0011 1111 0100 0000... 0000 0000 = 3F40 0000 hex
Der gewichtete Exponent ist 126 011 1111 0 Binär und die Mantisse ist (1) 100 0000... 0000 0000 1 1/2 ist.

2,5 = 1,25 * 2 ^ 1 = 0100 0000 0010 0000... 0000 0000 = 4020 0000 hex
Genau wie 2, außer wird in der Mantisse das Bit entspricht 1/4 festgelegt.

0,1 = 1,6 * 2 ^-4 = 0011 1101 1100 1100... 1100 1101 = 3DCC CCCD hex
1/10 ist binär Dezimalbruch wiederholte. Die Mantisse ist knapp 1,6, und der gewichtete Exponent besagt, dass 1,6 durch 16 zu teilen (binär, Dezimal 123 ist 011 1101 1 ist). Der echte Exponent ist 123 – 127 = – 4, was bedeutet, dass der Faktor multiplizieren, 2 **-4 = 1/16. Beachten Sie, dass die gespeicherte Mantisse im letzten Bit gerundet ist. Dies ist ein Versuch nicht darstellbare Zahl so genau wie möglich dargestellt. (Der Grund, 1: 10 und 1/100 binär nicht genau darstellbar sind ähnlich, dass 1/3 Dezimal nicht genau darstellbar ist.)

0 = 1.0 * 2 ^-128 = Null - ein Sonderfall.

Andere Fehlermeldungen Gleitkomma

Folgende sind Fehlermeldungen Gleitkommazahlen:

  1. Rundungsfehler


    Dieser Fehler tritt auf, wenn alle Bits in eine binäre Zahl in einer Berechnung verwendet werden kann.


    Beispiel: Hinzufügen von 0,0001, 0.9900 (einzelne Genauigkeit)


    0,0001 wird folgendermaßen dargestellt:
    (1) 10100011011011100010111 * 2^(-14+Bias) (13 führende 0 binär!)
    0.9900 wird folgendermaßen dargestellt:
    (1.)11111010111000010100011 * 2^(-1+Bias)
    Jetzt müssen tatsächlich diese nummerieren decimal (binär) Punkt ausgerichtet. Hierfür muß sie Unnormalized. Hier ist das resultierende hinzufügen:
           .000000000000011010001101 * 2^0  <- Only 11 of 23 Bits retained
    +.111111010111000010100011 * 2^0
    ________________________________
    .111111010111011100110000 * 2^0


    Dies ist ein Rundungsfehler bezeichnet, da einige Computer beim Hinzufügen runden. Andere einfach abgeschnitten. Rundungsfehler sind wichtig, wenn Sie hinzufügen oder multipliziert zwei sehr unterschiedliche Werte.
  2. Subtrahiert zwei gleich fast Werte
           .1235
    -.1234
    _____
    .0001


    Dies normalisiert werden. Beachten Sie, dass zwar ursprünglichen Zahlen vier signifikante Ziffern, das Ergebnis nur eine signifikante Ziffer.
  3. Überlauf und Unterlauf


    Dies tritt auf, wenn das Ergebnis zu groß oder zu klein, um durch den Datentyp dargestellt werden.
  4. Quantisierung Fehler


    Dies geschieht mit Nummern, die im Formular standardmäßig Gleitkommawert dargestellt werden können.
  5. Division durch wenige


    Diese lösen eine Fehlermeldung "Division durch Null" oder fehlerhafte Ergebnisse, wie im folgenden Beispiel:
          A = 112000000
    B = 100000
    C = 0.0009
    X = A - B / C


    In QuickBasic für MS-DOS X jetzt hat den Wert 888887, statt der richtigen Antwort 900000.
  6. Fehler


    Dieser Fehlertyp tritt Ausgabefunktionen Werte ändern sie arbeiten.
Eigenschaften

Artikelnummer: 42980 – Letzte Überarbeitung: 16.01.2017 – Revision: 2

Feedback