(Kompletný) Tutorial pochopiť IEEE pohyblivej rádovej čiarky chyby

Preklady článku Preklady článku
ID článku: 42980 - Zobraziť produkty, ktorých sa tento článok týka.
Rozbaliť všetko | Zbaliť všetko

Na tejto stránke

SUHRN

S pohyblivou rádovou čiarkou matematika je komplexná Téma, ktoré plete mnohé obvodov. Nižšie výučba by sa vám rozpoznať programovanie situácie, keď sú pravdepodobne vyskytnú pohyblivej rádovej čiarky chyby a ako im vyhnúť. To by tiež malo umožniť rozpoznáte prípadov, ktoré sú spôsobené inherentné matematiku pohyblivej rádovej čiarky obmedzenia ako protiklad k skutočné kompilátor chýb.

DALSIE INFORMACIE

Desatinné a dvojkovej číselnej sústave

Normálně, sme počítať veci v základom 10. Základňa je úplne svojvoľné. Jediným dôvodom je, že ľudia tradične používajú base 10 je, že majú 10 prstami, ktoré urobili šikovné počítanie nástroje.

Číslo 532.25 v desiatkovom formáte (základ 10) znamená nasledovné:
   (5 * 10^2) + (3 * 10^1) + (2 * 10^0) + (2 * 10^-1) + (5 * 10^-2)
       500    +     30     +      2     +     2/10    +    5/100
   _________
   =  532.25
				

V do dvojkovej sústavy (base 2), každý stĺpec predstavuje výkonom 2 namiesto 10. Napríklad číslo 101.01 znamená po:
   (1 * 2^2) + (0 * 2^1) + (1 * 2^0) + (0 * 2^-1) + (1 * 2^-2)
       4     +      0    +     1     +      0     +    1/4
   _________
   =  5.25  Decimal
				

Ako celé čísla sú zastúpené v ks

Pretože nie je frakčnou časť na integer, jeho stroj zastupovanie je oveľa jednoduchšie, ako je to s pohyblivou rádovou čiarkou hodnôt. Normálne, celé čísla na osobné počítače (PC) sú 2 bajty (16 bitov) dlho s najvýznamnejší bit uvedením znamienko. Long Integer sú 4 bajty. Kladné hodnoty sú priamočiare binárne čísla. Napríklad:
    1 Decimal = 1 Binary
    2 Decimal = 10 Binary
   22 Decimal = 10110 Binary, etc.
				

Avšak, záporné celé čísla sú reprezentované pomocou týchto dvoch komplement schéma. Získať týchto dvoch komplement zastúpenie pre negatívne čísla, prijať binárne zastúpenie pre číslo absolútnej hodnote a potom flip všetky bity a pridajte 1. Napríklad:
   4 Decimal = 0000 0000 0000 0100
               1111 1111 1111 1011     Flip the Bits
   -4        = 1111 1111 1111 1100     Add 1
				

Všimnite si, že -1 desatinné = 1111 1111 1111 1111 v binárny, čo vysvetľuje Prečo Basic zaobchádza s -1 ako logickú hodnotu true (všetky bity = 1). To je dôsledkom nemajú samostatné subjekty logickú a logické porovnania. Často v Basic, je výhodné použiť fragment kódu nižšie keď váš program tvorby veľa logických porovnaní. Toto významne napomáha čitateľnosť.
   CONST TRUE = -1
   CONST FALSE = NOT TRUE
				

Všimnite si, pridaním ľubovoľnú kombináciu dva roky komplement čísiel spolu pomocou bežných binárne aritmetický vyrába správny výsledok.

S pohyblivou rádovou čiarkou komplikácií

Každý desiatkové celé číslo môžete presne reprezentované binárne celé číslo; Avšak, to nie je pravda pre frakčnou čísla. V skutočnosti každý číslo, ktoré je iracionálne v základnej 10 bude aj iracionálne v ktoromkoľvek systém so základňou menší ako 10.

Pre binárny, najmä, len frakčnou čísla, ktoré môžu byť kde q je celočíselnú mocninu 2, môžu byť zastúpené vo forme p/q, vyjadrené presne, s konečný počet bitov.

Nemôže byť dokonca spoločné desatinné zlomky, napríklad desatinné 0,0001 zastúpené presne v binary. (0,0001 je zlomok opakujúce sa binárne s obdobím 104 bitov!)

To vysvetľuje, prečo jednoduchý príklad, ako sú nasledovné
   SUM = 0
   FOR I% = 1 TO 10000
      SUM = SUM + 0.0001
   NEXT I%
   PRINT SUM                   ' Theoretically = 1.0.
				

bude tlačiť 1.000054 ako výstup. Malá chyba v zastupujúcich 0,0001 v binary propaguje súčtu.

Z rovnakého dôvodu, ste vždy mali veľmi opatrní pri prijímaní porovnania v reálnych čísel. Nasledujúci príklad ilustruje spoločné programovanie chyba:
   item1# = 69.82#
   item2# = 69.20# + 0.62#
   IF item1# = item2# then print "Equality!"
				

To nie je možné VYTLAČIŤ "Rovnosť!" pretože 69.82 nemôže byť zastúpené presne v binárny, ktorý spôsobuje hodnota, ktorá vyplýva z Priradenie MIERNE odlišný (binárne) ako hodnota, ktorá je generované z výrazu. V praxi by mali vždy kód takéto porovnanie tak, aby umožňovalo určitá tolerancia. Pre Príklad:
   IF (item1# < 69.83#) AND (item1# > 69.81#) then print "Equal"
				

Bude tlačiť "Rovnajú".

IEEE formát čísla

QuickBasic pre MS-DOS, verzia 3.0 bol dodaný s MBF (Microsoft binárny plávajúce bod) verzia a IEEE (Institute of Electrical and Electronics Engineers) verzia pre stroje s matematický koprocesor. QuickBasic pre MS-DOS, verzie 4.0 a novšej používať len IEEE. Microsoft zvolili štandard IEEE zastupovať s pohyblivou rádovou čiarkou hodnôt v aktuálnych verziách základného na nasledujúce tri základné dôvody:
  1. Umožniť Basic používať matematické koprocesory Intel, ktoré používajú IEEE formát. Intel 80 x 87 série koprocesory nemôže pracovať s Microsoft binárny formát čísla.
  2. Aby interlanguage volania medzi Basic, C, Pascal, Fortran, HASKELL, a MASM oveľa jednoduchšie. V opačnom prípade by museli konverzie rutiny použiť môžete odoslať číselné hodnoty z jedného jazyka do druhého.
  3. Na dosiahnutie konzistentnosti. IEEE je uznávaný priemyselný štandard pre C a FORTRAN kompilátory.
Nasledujúce je rýchle porovnanie IEEE a MBF zastúpenia -dvojitej presnosti čísle:
               Sign Bits   Exponent Bits   Mantissa Bits
               ---------   -------------   -------------
   IEEE        1           11              52 + 1 (Implied)
    MBF        1            8              56
				

Ďalšie informácie o rozdieloch medzi IEEE a MBF s pohyblivou rádovou čiarkou zastúpenie, dotaz v databáze Microsoft Knowledge Base na nasledujúce slová:
   IEEE and floating and point and appnote
				

Všimnite si, že IEEE má viac bitov venovaný exponent, ktorý umožňuje ho zastupovať širší rozsah hodnôt. MBF má viac mantisy bitov, ktoré umožňuje, aby sa presnejšie rozsahu jeho užší.

General Concepts s pohyblivou rádovou čiarkou

Je veľmi dôležité si uvedomiť, že akýkoľvek binárne pohyblivej rádovej čiarky systém môže predstavovať len konečný počet pohyblivej rádovej čiarky hodnoty v presný formulár. Všetky ostatné hodnoty musí aproximovať najbližšie representable hodnota. Štandard IEEE určuje metódu pre zaokrúhľovanie hodnoty "najbližšie" representable hodnotu. QuickBasic pre systém MS-DOS podporuje štandard a zaokrúhli podľa IEEE pravidlá.

Tiež, majte na pamäti, že čísla, ktoré môžu byť zastúpené vo IEEE sú rozložené počas veľmi široký. Môžete si ich predstaviť na číslo riadku. Existuje vysokou hustotou representable čísla blízkosti 1.0 a-1.0, ale stále menej a menej, ako idete smerom k 0 alebo nekonečno.

Cieľ IEEE štandardom, ktorý je navrhnutý pre inžinierstvo výpočty, je maximalizovať presnosť (dostať čo najbližšie k skutočný počet). Presnosť sa vzťahuje na počet číslic, ktoré ste môže predstavovať. Štandard IEEE pokúša rovnováhu medzi počtom bity venovaný exponent s počet bitov používaných pre frakčnou časť čísla udržať správnosť a presnosť v rámci prijateľných limitov.

IEEE podrobnosti

S pohyblivou rádovou čiarkou čísla sú zastúpené v nasledujúcej forme, kde [exponent] je exponent, na binárne:
   X =  Fraction * 2^(exponent - bias)
				

[Zlomok] je normalizovanom frakčnou časť čísla, normalizovaná pretože exponent sa upraví tak, aby vedúci bit je vždy 1. Týmto spôsobom, nesmie sa skladovať, a dostanete jeden viac bit presnosti. To je dôvod, prečo tam je implicitné bit. Môžete myslieť to rád exponenciálnom, kde môžete manipulovať exponent na majú jedna číslica naľavo od desatinnej čiarky, s výnimkou binárny, môžete vždy môžete manipulovať exponent tak, aby prvý bit 1, pretože existuje iba 1s a 0s.

[zaujatosti] je bias hodnotu použitú sa predišlo potrebe uložiť negatívne exponentoch.

Systematickej jedinej-presné čísla je 127 a 1023 (desiatkovo) pre -dvojitej presnosti čísla.

Hodnoty rovné všetky 0 a všetky 1 (binárne) sú vyhradené pre predstavujúce osobitné prípady. Existujú aj iné špeciálne prípady ktoré označujú rôzne chyby podmienky.

Jedinej-presnosťou príklady

2 = 1 * 2 ^ 1 = 0100 0000 0000 0000... 0000 0000 = 4000 0000 hex
Poznámka bit znamienka je nula a uložené exponent je 128, alebo 100 0000 0 v binárnych, ktoré je 127 plus 1. Uložené mantisy je (.) 1000 0000... 0000 0000, ktorý má implikovaných popredných 1 a binárny bodu, tak skutočné mantisy je 1.

-2 = -1 * 2 ^ 1 = 1100 0000 0000 0000... 0000 0000 = C000 0000 hex
Rovnaké ako + 2 okrem toho, že je nastavený bit znamienka. To platí pre všetky IEEE formát s pohyblivou rádovou čiarkou čísla.

4 = 1 * 2 ^ 2 = 0100 0000 1000 0000... 0000 0000 = 4080 0000 hex
Rovnaké mantisy exponent zvyšuje jedným (neobjektívne hodnota je 129, alebo 100 0000 1 v binary.

6 = 1.5 * 2 ^ 2 = 0100 0000 1100 0000... 0000 0000 = 40 C 0 0000 hex
Rovnaké exponent mantisy je väčšia o polovicu--je (1.) 100 0000... 0000 0000, ktoré, pretože je to binárnu zlomok, je 1-1/2 (frakčnou číslice sú hodnoty 1/2, 1/4, 1/8, atď.).

1 = 1 * 2 ^ 0 = 0011 1111 1000 0000... 0000 0000 = 3F80 0000 hex
Rovnaké exponenta ako iné právomoci 2, mantisy je jeden menej ako 2 na 127 alebo 011 1111 1 v binary.

.75 = 1.5 * 2 ^ -1 = 0011 1111 0100 0000... 0000 0000 = 3F40 0000 hex
Neobjektivní exponent je 126, 011 1111 0 v binárnych a mantisy je (1.) 100 0000... 0000 0000, ktorá je 1-1/2.

2.5 = 1,25 * 2 ^ 1 = 0100 0000 0010 0000... 0000 0000 = 4020 0000 hex
Presne rovnaký ako 2 okrem toho, že je bit, ktorý predstavuje 1/4 nastaviť v mantisy.

0,1 = 1,6 * 2 ^ -4 = 0011 1101 1100 1100... 1100 1101 = 3DCC CCCD hex
1/10 je zlomok opakujúcej sa v binary. Mantisy je len nesmelý na 1.6, a skreslené exponent hovorí, že 1.6 sa vydelí 16 (je to 011 1101 1 v binárny, ktorá je 123 v desiatkovom formáte). Pravda exponent je 123-127 = - 4, čo znamená, že faktor, ktorým na násobenie je 2 ** -4 = 1/16. Všimnite si, že je uložené mantisy zaokrúhlené nahor v posledný bit. Jedná sa o pokus zastupovať unrepresentable číslo čo najpresnejšie. (Z dôvodu že 1/10 a 1/100 sú presne representable v binary je podobný na ceste, že 1/3 je presne representable v desiatkovom formáte.)

0 = 1,0 * 2 ^-128 = núl--špeciálny prípad.

Iné spoločné operácie v pohyblivej rádovej chyby

Nasledujú bežné pohyblivej rádovej čiarky chyby:
  1. Zaokrúhliť chyba

    Táto chyba vzniká vtedy, keď všetky bity v binárne číslo nemožno použiť vo výpočte.

    Príklad: Pridanie 0,0001 na 0.9900 (jediný presnosť)

    Desatinné 0,0001 zastúpené ako:
    (1.) 10100011011011100010111 * 2^(-14+Bias) (13 vedie 0s v Binárne!)
    0.9900 budú zastúpené ako:
    (1.) 11111010111000010100011 * 2^(-1+Bias)
    Teraz sa vlastne pridať tieto čísla, desatinné (binárne) body musia byť zarovnané. To musí byť Unnormalized. Tu je výsledné pridanie:
           .000000000000011010001101 * 2^0  <- Only 11 of 23 Bits retained
          +.111111010111000010100011 * 2^0
          ________________________________
           .111111010111011100110000 * 2^0
    
    						
    Toto sa nazýva zaokrúhliť chyba, pretože niektoré počítače kolo, keď presúva na doplnenie. Ostatné jednoducho skrátiť. Zaokrúhliť chyby sú dôležité zvážiť vždy, keď pridávate alebo súčin dvoch veľmi odlišné hodnoty.
  2. Odčítanie hodnoty dvoch takmer rovnaké hodnoty
           .1235
          -.1234
           _____
           .0001
    
    						
    To bude štandardizovať. Všimnite si, že hoci pôvodné čísla Každý mal štyri významné číslice, výsledok má len jeden významných číslic.
  3. Pretečenie a podtečenie

    To sa vyskytuje, keď výsledok je príliš veľký alebo príliš malý na zastúpení typ údajov.
  4. Quantizing chyba

    S tými číslami, ktoré nemôžu byť zastúpené vo presné v takom formulár s pohyblivou rádovou čiarkou štandardom.
  5. Rozdelenie veľmi malé množstvo

    To môže vyvolať "delenie nulou" chyba alebo môžu produkovať zlé výsledky, ako v nasledujúcom príklade:
          A = 112000000
          B = 100000
          C = 0.0009
          X = A - B / C
    
    						
    V QuickBasic pre MS-DOS, X teraz má hodnotu 888887, namiesto správnu odpoveď, 900000.
  6. Výstup chyba

    Tento typ chyby sa vyskytuje, keď zmeniť výstupné funkcie hodnoty pracujú s.

Vlastnosti

ID článku: 42980 - Posledná kontrola: 10. októbra 2011 - Revízia: 2.0
Informácie v tomto článku sa týkajú nasledujúcich produktov:
  • 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
Kľúčové slová: 
kbmt KB42980 KbMtsk
Strojovo preložené
DÔLEŽITÉ: Tento článok bol preložený pomocou softvéru na strojový preklad od spoločnosti Microsoft, nie prekladateľom. Spoločnosť Microsoft ponúka články preložené prekladateľmi aj strojovo preložené články, vďaka čomu máte možnosť prístupu ku všetkým článkom databázy Knowledge Base vo svojom jazyku. Strojovo preložený článok však nie je vždy perfektný. Môže obsahovať chyby týkajúce sa slovnej zásoby, syntaxe alebo gramatiky, podobne ako cudzinec môže robiť chyby, keď rozpráva vašim jazykom. Spoločnosť Microsoft nenesie zodpovednosť za akékoľvek nepresnosti, chyby alebo škody spôsobené akýmkoľvek nepresným prekladom obsahu alebo jeho použitím zo strany zákazníkov. Spoločnosť Microsoft softvér na strojový preklad pravidelne aktualizuje.
Pokiaľ chcete vidieť anglickú verziu článku, kliknite sem:42980
Upozornenie na neaktuálny obsah článku databázy KB
Tento článok obsahuje informácie o produktoch, pre ktoré spoločnosť Microsoft už neposkytuje technickú podporu. Z tohto dôvodu je tento článok publikovaný ako nezmenený a už nebude aktualizovaný.

Odošlite odozvu

 

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