(Voltooien) Zelfstudie IEEE drijvende fouten begrijpen

Vertaalde artikelen Vertaalde artikelen
Artikel ID: 42980 - Bekijk de producten waarop dit artikel van toepassing is.
Alles uitklappen | Alles samenvouwen

Op deze pagina

Samenvatting

Drijvende wiskunde is een complex onderwerp dat veel confuses programmeurs. De zelfstudie hieronder kunt u herkennen programmeren situaties waarin de drijvende fouten optreden en hoe Vermijd ze. Deze moet ook kunnen aanvragen die worden herkend veroorzaakt door de drijvende-kommaberekeningen inherente beperkingen in tegenstelling tot werkelijke compiler fouten.

Meer informatie

Decimaal en binaire stelsels

Normaal gesproken tellen we dingen in het grondtal 10. De base is volledig willekeurige. De enige reden dat mensen hebben traditioneel base gebruikt 10 is dat zij 10 vingers hebt aangebracht handige tellen hulpprogramma's.

Het aantal 532.25 in decimale (grondtal 10) verstaan:
   (5 * 10^2) + (3 * 10^1) + (2 * 10^0) + (2 * 10^-1) + (5 * 10^-2)
       500    +     30     +      2     +     2/10    +    5/100
   _________
   =  532.25
				

In het binaire systeem (grondtal 2) vertegenwoordigt elke kolom een macht 2 in plaats van 10. Het aantal 101.01 betekent bijvoorbeeld dat de volgende:
   (1 * 2^2) + (0 * 2^1) + (1 * 2^0) + (0 * 2^-1) + (1 * 2^-2)
       4     +      0    +     1     +      0     +    1/4
   _________
   =  5.25  Decimal
				

Hoe gehele getallen worden weergegeven in pc 's

Omdat er geen breuk een integer de machine representatie is veel eenvoudiger dan de drijvende-kommawaarden. Normaal gehele getallen op personal computers (pc's) zijn 2 bytes (16 bits) lang met de de meest significante bit het teken. Long integers zijn 4 bytes lang. Positieve waarden zijn eenvoudige binaire getallen. Bijvoorbeeld:
    1 Decimal = 1 Binary
    2 Decimal = 10 Binary
   22 Decimal = 10110 Binary, etc.
				

Echter worden negatieve getallen aangeduid met behulp van de twee de aanvulling het schema. De twee de aanvulling vertegenwoordiging voor negatieve ophalen nummer, nemen de binaire weergave van het aantal de absolute waarde en de bits spiegelen en 1 toevoegen. Bijvoorbeeld:
   4 Decimal = 0000 0000 0000 0100
               1111 1111 1111 1011     Flip the Bits
   -4        = 1111 1111 1111 1100     Add 1
				

Houd er rekening mee dat -1 Decimaal = 1111 1111 1111 1111 binair, waarin wordt uitgelegd Waarom Basic -1 als logische true behandelt (alle bits = 1). Dit is een gevolg van afzonderlijke operatoren voor bitsgewijs en logische niet vergelijkingen. In Basic is het vaak handig gebruik van het codefragment onder het programma wordt wanneer de waardoor veel logische vergelijkingen. Dit aanzienlijk prettig.
   CONST TRUE = -1
   CONST FALSE = NOT TRUE
				

Opmerking toevoegen een combinatie van twee complementaire getallen samen met behulp van gewone binaire rekenkundige oplevert het juiste resultaat.

Drijvende complicaties

Elk geheel getal precies wordt vertegenwoordigd door een binaire integer; Dit geldt echter niet voor decimale getallen. In feite elke nummer van irrational grondtal 10 worden ook in een irrational systeem met een kleiner dan 10 base.

Voor binaire in bepaalde, alleen decimale getallen kunnen worden vertegenwoordigd in het formulier p/q, kan waarbij q is een gehele macht van 2, worden precies, uitgedrukt met een eindig aantal bits.

Zelfs veelvoorkomende decimale breuken, zoals de decimale waarde 0,0001, kunnen niet worden precies in binaire notatie wordt weergegeven. (0,0001 is een herhalende binaire fractie met een periode van 104 bits!)

Dit verklaart waarom een eenvoudig voorbeeld, zoals de volgende
   SUM = 0
   FOR I% = 1 TO 10000
      SUM = SUM + 0.0001
   NEXT I%
   PRINT SUM                   ' Theoretically = 1.0.
				

1.000054 afdrukken wordt als uitvoer. De kleine fout 0,0001 doorgeven aan de som in binaire notatie.

Om dezelfde reden moet u altijd voorzichtig zeer bij vergelijkingen op reële getallen. Het volgende voorbeeld wordt een algemene fout programmeren:
   item1# = 69.82#
   item2# = 69.20# + 0.62#
   IF item1# = item2# then print "Equality!"
				

Dit worden 'Gelijkheid!' niet AFGEDRUKT omdat de 69.82 kan niet worden weergegeven exact in binaire, waardoor de waarde van de toewijzing (in binaire notatie) iets anders is dan de waarde die is gegenereerd uit de expressie. In de praktijk moet u altijd code dergelijke vergelijkingen zodanig enkele tolerantie toegestaan. Voor Voorbeeld:
   IF (item1# < 69.83#) AND (item1# > 69.81#) then print "Equal"
				

Dit wordt 'Gelijk aan' AFGEDRUKT.

IEEE-notatie getallen

QuickBasic voor MS-DOS, versie 3.0 is geleverd met een MBF Versie (Microsoft binaire Floating Point) en een IEEE (Institute of Electrical and Electronics Engineers) versie voor machines met een rekenkundige coprocessor. QuickBasic voor MS-DOS, versie 4.0 en hoger Gebruik alleen IEEE. Microsoft heeft ervoor gekozen de IEEE-standaard vertegenwoordigen drijvende komma-waarden in de huidige versies van Basic voor de volgende drie primaire redenen:
  1. Basic gebruiken de wiskundige coprocessors van Intel, waarmee IEEE toestaan indeling. De coprocessors van de serie Intel 80 x 87 werkt niet met Getallen, binaire indeling van Microsoft.
  2. Interlanguage aanroepen tussen Basic, C, Pascal, FORTRAN, maken en MASM veel eenvoudiger. Anders zou conversie routines moeten numerieke waarden verzenden vanaf één taal naar de andere worden gebruikt.
  3. Consistentie bereiken. IEEE is de geaccepteerde industriestandaard voor Compilers c en FORTRAN.
Het volgende is een snelle vergelijking IEEE en MBF voorstellingen voor een getal met dubbele precisie:
               Sign Bits   Exponent Bits   Mantissa Bits
               ---------   -------------   -------------
   IEEE        1           11              52 + 1 (Implied)
    MBF        1            8              56
				

Voor meer informatie over de verschillen tussen IEEE en MBF drijvende komma representatie, in de Microsoft Knowledge Base op query de volgende woorden:
   IEEE and floating and point and appnote
				

IEEE heeft meer bits gewijd aan de exponent waarmee het is aan een breder bereik van waarden. MBF heeft meer bits mantisse waardoor deze binnen het bereik smaller nauwkeuriger.

Algemene drijvende concepten

Het is heel belangrijk om te bedenken dat alle binaire drijvende systeem kan een eindig aantal drijvende exacte waarden vertegenwoordigen formulier. Alle andere waarden moeten worden benaderd door de dichtstbijzijnde weergegeven waarde. De standaard IEEE geeft de methode voor afronding van de "dichtstbijzijnde" waarde van de weergegeven waarden. QuickBasic ondersteunt de standaard voor MS-DOS en wordt afgerond op basis van de IEEE regels.

Ook, houd rekening met de getallen die kunnen worden weergegeven in IEEE zijn verdeeld over een zeer groot. U kunt deze Stel op een lijn nummer. Er is een hoge dichtheid van de weergegeven getallen bij 1.0 en 1,0 maar minder en minder als u Ga naar 0 of oneindig.

Het doel van de IEEE-standaard is ontworpen voor engineering berekeningen, is voor een maximale nauwkeurigheid (om zo dicht mogelijk te het werkelijke aantal). Precision verwijst naar het aantal cijfers dat u kan vertegenwoordigen. De standaard IEEE pogingen evenwicht tussen het aantal bits gewijd aan de exponent met het aantal bits dat wordt gebruikt voor de fractionele deel van het nummer, nauwkeurigheid en precisie binnen aanvaardbare grenzen.

IEEE-Details

Getallen met drijvende komma worden weergegeven in de volgende vorm waar [exponent] is de binaire exponent:
   X =  Fraction * 2^(exponent - bias)
				

[] Is de genormaliseerde fractionele deel van het getal aan omdat de exponent is aangepast zodat de toonaangevende bits altijd is een 1. Deze manier het hoeft niet te worden opgeslagen en u krijgt meer bit precisie. Daarom is er een impliciete bit. U kunt zien Dit zoals wetenschappelijke notatie, waarbij het manipuleren van de exponent één cijfer links van het decimaalteken, behalve in binaire, hebt u kan de exponent altijd bewerken zodat de eerste bit een 1 sindsdien is Er zijn alleen enen en nullen.

[bias] is de bias-waarde gebruikt om te voorkomen dat negatieve opslaan exponenten.

De bias voor getallen met enkele precisie is 127 en 1023 (decimaal) voor getallen met dubbele precisie.

De waarden gelijk zijn aan alle 0 en alle 1 (binary) zijn gereserveerd voor speciale gevallen vertegenwoordigt. Er zijn ook andere speciale gevallen die verschillende fouten aangeven.

Voorbeelden van enkele precisie

2 = 1 * 2 ^ 1 = 0100 0000 0000 0000... 0000 0000 = 4000 0000 hex
De teken-bit is ingesteld op nul en is de exponent opgeslagen 128, of 100 0000 0 binair, 127 plus 1. Is de mantisse opgeslagen (1). 000 0000... 0000-0000, een impliciete voorloop-1 heeft en binaire punt, zodat de werkelijke mantisse 1 is.

-2 = -1 * 2 ^ 1 = 1100 0000 0000 0000... 0000-0000 = C000 0000 hex
Hetzelfde als 2 behalve de teken-bit is ingesteld. Dit geldt voor alle IEEE indeling getallen met drijvende komma.

4 = 1 * 2 ^ 2 = 0100 0000 0000 1000... 0000 0000 = 4080 0000 hex
Dezelfde mantisse exponent met één verhoogd (vertekende waarde is 129, of 100 0000 1 binair.

6 = 1,5 * 2 ^ 2 = 0100 0000 0000 1100... 0000-0000 40 = 0 C 0000 hex
Dezelfde exponent mantisse groter met de helft is, dat is (1). 100 0000... 0000-0000, welke, aangezien dit een binair breuk, is 1-1/2 (de waarden van de cijfers zijn 1/2 1/4, 1/8, enz.).

1 = 1 * 2 ^ 0 1111 0011 = 1000 0000... 0000-0000 = 3F80 0000 hex
Dezelfde exponent als andere machten van 2 mantisse is één minder dan 2 127 of 011 1111 1 binair.

.75 = 1,5 * 2 ^ -1 = 0011 1111 0100 0000... 0000-0000 = 3F40 0000 hex
De vertekende exponent is 126 011 1111 0 in binaire bestanden en de mantisse (1). 100 0000... 0000-0000 is 1-1/2.

2.5 = 1,25 * 2 ^ 1 0100 0000 = 0010 0000... 0000 0000 = 4020 0000 hex
Exact gelijk aan 2, maar dat de bit die 1/4 is Stel in de mantisse.

0,1 = 1,6 * 2 ^ -4 = 0011 1101 1100 1100... 1100 1101 = 3DCC CCCD hex
1/10 is een herhalende fractie binair. De mantisse is gewoon shy van 1.6 en onzuivere exponent zegt 1.6 wordt gedeeld door 16 (011 1101 is 1, binair, 123 in decimalen is). De true exponent is 123 127 = - 4, wat betekent dat de factor waarmee vermenigvuldigen is 2 ** -4 = 1/16. De mantisse opgeslagen wordt in de laatste bit afgerond. Dit is een poging te vertegenwoordigen de unrepresentable aantal zo nauwkeurig mogelijk. (De reden dat 1/10 en 1/100 zijn niet precies weergegeven in binaire lijkt de manier is 1/3 niet precies weergegeven in decimale.)

0 = 1,0 * 2 ^ -128 = nullen--een speciaal geval.

Andere veelvoorkomende fouten met drijvende komma

Algemene drijvende fouten zijn:
  1. Afrondingsfouten

    Deze fout treedt op wanneer alle bits in een binair getal kan niet in een berekening worden gebruikt.

    Voorbeeld: Toevoegen 0,0001 naar 0.9900 (enkele precisie)

    Decimale waarde 0,0001 worden weergegeven als:
    (1). 10100011011011100010111 * 2^(-14+Bias) (13 nullen in toonaangevende Binaire!)
    0.9900 worden weergegeven als:
    (1). 11111010111000010100011 * 2^(-1+Bias)
    Nu daadwerkelijk deze nummers toevoegen, moet de decimale punten (binair) uitgelijnd. Dit zijn Unnormalized. Hier wordt de resulterende toevoeging:
           .000000000000011010001101 * 2^0  <- Only 11 of 23 Bits retained
          +.111111010111000010100011 * 2^0
          ________________________________
           .111111010111011100110000 * 2^0
    
    						
    Dit is een fout afronden genoemd omdat sommige computers wanneer afronden voor verschuiven. Anderen gewoon afkappen. Afrondingsfouten zijn belangrijk om te overwegen wanneer u toevoegt of vermenigvuldigen van twee zeer verschillende waarden.
  2. Af te trekken van twee gelijke vrijwel waarden
           .1235
          -.1234
           _____
           .0001
    
    						
    Dit wordt genormaliseerd. Hoewel de oorspronkelijke nummers elk had vier significante cijfers, het resultaat is één significante cijfers.
  3. Overloop en negatieve overloop

    Dit gebeurt wanneer het resultaat is te groot of te klein om vertegenwoordigd door het gegevenstype.
  4. Fout quantizing

    Dit gebeurt met de nummers niet in de exacte weergegeven formulier door de drijvende-standaard.
  5. Deling door een heel klein getal

    Dit kan een fout 'delen door nul' activeren of onjuiste leveren resultaten, zoals in het volgende voorbeeld:
          A = 112000000
          B = 100000
          C = 0.0009
          X = A - B / C
    
    						
    In QuickBasic voor MS-DOS X nu heeft de waarde 888887, in plaats van het juiste antwoord, 900000.
  6. Bij uitvoer

    Dit type fout treedt op wanneer de output functies veranderen de ze met werken waarden.

Eigenschappen

Artikel ID: 42980 - Laatste beoordeling: zaterdag 9 juni 2012 - Wijziging: 4.0
De informatie in dit artikel is van toepassing op:
  • Microsoft Visual Basic 2.0 Standard Edition
  • Microsoft Visual Basic 3.0 Professional Edition
  • Microsoft Visual Basic 1.0 Standard Edition
  • Microsoft Visual Basic 2.0 Professional Edition
  • Microsoft BASIC Professional Development System 7.0
Trefwoorden: 
kbmt KB42980 KbMtnl
Automatisch vertaald artikel
BELANGRIJK: Dit artikel is vertaald door de vertaalmachine software van Microsoft in plaats van door een professionele vertaler. Microsoft biedt u professioneel vertaalde artikelen en artikelen vertaald door de vertaalmachine, zodat u toegang heeft tot al onze knowledge base artikelen in uw eigen taal. Artikelen vertaald door de vertaalmachine zijn niet altijd perfect vertaald. Deze artikelen kunnen fouten bevatten in de vocabulaire, zinsopbouw en grammatica en kunnen lijken op hoe een anderstalige de taal spreekt en schrijft. Microsoft is niet verantwoordelijk voor onnauwkeurigheden, fouten en schade ontstaan door een incorrecte vertaling van de content of het gebruik ervan door onze klanten. Microsoft past continue de kwaliteit van de vertaalmachine software aan door deze te updaten.
De Engelstalige versie van dit artikel is de volgende: 42980
Vrijwaring inhoud KB-artikelen over niet langer ondersteunde producten
Dit artikel heeft betrekking op producten waarvoor Microsoft geen ondersteuning meer biedt. Daarom wordt dit artikel alleen in de huidige vorm aangeboden en wordt het niet meer bijgewerkt.

Geef ons feedback

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com