(Dokončit) Kurz porozumět IEEE chyby s plovoucí desetinnou čárkou

Překlady článku Překlady článku
ID článku: 42980 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Souhrn

Matematika s plovoucí desetinnou čárkou je složité téma, které mnoho confuses Programátoři. Kurz níže by vám rozpoznat programování situacích, kdy jsou pravděpodobnější s plovoucí desetinnou čárkou chyby a jak Vyhněte se jim. Měla by také umožnit rozpoznatelný případy, které jsou způsobené omezení spojená s plovoucí desetinnou čárkou math oproti Kompilátor skutečné chyby.

Další informace

Desítkové a binární číselnou soustavu

Normálně jsme počítat věci v základní 10. Základní je zcela libovolný. Jediným důvodem, že lidé mají tradičně base 10 je, že mají 10 prsty, které jste provedli v ruce počítání nástroje.

532.25 Číslo v desítkové soustavě (základ 10) znamená následující:
   (5 * 10^2) + (3 * 10^1) + (2 * 10^0) + (2 * 10^-1) + (5 * 10^-2)
       500    +     30     +      2     +     2/10    +    5/100
   _________
   =  532.25
				

Binární číselnou soustavu (základ 2) každý sloupec představuje napájení 2 namísto 10. Například číslo 101.01 znamená, že následující:
   (1 * 2^2) + (0 * 2^1) + (1 * 2^0) + (0 * 2^-1) + (1 * 2^-2)
       4     +      0    +     1     +      0     +    1/4
   _________
   =  5.25  Decimal
				

Zastoupení celá čísla v počítačích

Protože neexistuje zlomkovou část na celé jeho počítače. reprezentace je mnohem jednodušší, než je pro hodnoty s plovoucí desetinnou čárkou. Normální celá čísla v osobních počítačích (KS) jsou 2 bajty (16 bitů) dlouho se Nejvýznamnější bit označující znaménko. Long Integer mají délku 4 bajtů. Kladné hodnoty jsou jednoduché binární čísla. Například:
    1 Decimal = 1 Binary
    2 Decimal = 10 Binary
   22 Decimal = 10110 Binary, etc.
				

Záporná celá čísla však jsou reprezentovány pomocí dvojkový doplněk schéma. Chcete-li získat dva jeho doplňkem znázornění negativní číslo, trvat binární reprezentaci pro absolutní hodnotu číslo Překlopit všechny bity a přidejte 1. Například:
   4 Decimal = 0000 0000 0000 0100
               1111 1111 1111 1011     Flip the Bits
   -4        = 1111 1111 1111 1100     Add 1
				

Všimněte si, že -1 desetinné = 1111 1111 1111 1111 v binárním, což vysvětluje Proč Basic považuje za logickou hodnotu PRAVDA -1 (všechny bity = 1). Jedná se Důsledkem bez nutnosti oddělené operátory bitového a logické porovnání. Často Basic, je vhodné použít fragment kódu pod program bude při provádění mnoha logických porovnání. To velmi výhodné čitelnost.
   CONST TRUE = -1
   CONST FALSE = NOT TRUE
				

Všimněte si, že přidání libovolnou kombinaci čísel dvojkový doplněk společně pomocí běžných binární aritmetické vznikne správný výsledek.

Komplikace s plovoucí desetinnou čárkou

Každý desítkové celé číslo lze přesně zastoupen binární celé číslo; není to však platí pro zlomky. Ve skutečnosti každý číslo, které je nenormální základní 10 bude také v libovolném nenormální systém s base, která je menší než 10.

Pro binární, zejména, pouze zlomek čísel, který může být kde q je celočíselná mocnina 2, mohou být zastoupeny ve formě p/q, vyjadřuje přesně, s omezený počet bitů.

Nemůže být ani běžná desetinná čísla, jako je například desítkové číslo 0,0001 zastoupeny v binárním přesně. (0,0001 je periodický binární zlomek s dobou 104 bitů!)

To vysvětluje, proč jednoduchý příklad, jako například
   SUM = 0
   FOR I% = 1 TO 10000
      SUM = SUM + 0.0001
   NEXT I%
   PRINT SUM                   ' Theoretically = 1.0.
				

Tisk 1.000054 bude jako výstup. Malá chyba 0,0001 v binárním propaguje do součtu.

Ze stejného důvodu vždy buďte velmi opatrní při vytváření porovnání v reálných hodnotách. Následující příklad ukazuje běžné chyby v programování:
   item1# = 69.82#
   item2# = 69.20# + 0.62#
   IF item1# = item2# then print "Equality!"
				

To nebude TISKNOUT "Rovnost!" protože nemůže být reprezentován 69.82 přesně v binárním, což způsobuje, že hodnotu, která je výsledkem přiřazení se MÍRNĚ liší (binární) než je hodnota, která je generované z výrazu. V praxi by měla vždy kódu takové srovnání takovým způsobem, aby některé odchylky. Pro Příklad:
   IF (item1# < 69.83#) AND (item1# > 69.81#) then print "Equal"
				

"Rovné" bude TISKNOUT.

IEEE formát čísel

Jazyk QuickBasic pro MS-DOS verze 3.0 dodávanou MBF Verze (Microsoft binární plovoucích bod) a IEEE (Institute of Verze Electrical and Electronics Engineers) pro počítače s Matematický koprocesor. Jazyk QuickBasic pro MS-DOS verze 4.0 a vyšší pouze pomocí IEEE. Microsoft zvolili představovat standardu IEEE hodnoty s plovoucí desetinnou čárkou v aktuální verze Basic pro následující tři hlavní důvody:
  1. Povolit základní použití coprocessors math Intel, které používají IEEE formát. Coprocessors řady Intel 80 x 87 nelze pracovat. Microsoft binární formát čísla.
  2. Aby interlanguage volání mezi Basic, C, Pascal, FORTRAN, a jazyk MASM mnohem snadnější. Jinak by musel rutiny převodu použít k odeslání číselné hodnoty z jednoho jazyka.
  3. K dosažení konzistence. IEEE je standard pro Kompilátorů c a FORTRAN.
V následující tabulce je rychlé porovnání IEEE a MBF zastoupení číslo s dvojitou přesností:
               Sign Bits   Exponent Bits   Mantissa Bits
               ---------   -------------   -------------
   IEEE        1           11              52 + 1 (Implied)
    MBF        1            8              56
				

Další informace o rozdílech mezi IEEE a MBF reprezentace s plovoucí desetinnou čárkou, dotaz v databázi Microsoft Knowledge Base na Následující slova:
   IEEE and floating and point and appnote
				

Upozorňujeme, že IEEE má více bitů, které jsou vyhrazeny pro exponent, který umožňuje Chcete-li jej představovat širší rozsah hodnot. MBF má více bitů mantisy, který umožňuje přesnější v jeho dosahu užší.

Obecné principy s plovoucí desetinnou čárkou

Je velmi důležité si uvědomit, že každý binární systém s plovoucí desetinnou čárkou může představovat pouze omezený počet hodnot s plovoucí čárkou v přesné formulář. Všechny ostatní hodnoty musí být aproximována nejblíže Hodnota reprezentovat. IEEE standard určuje metodu pro Zaokrouhlení hodnoty na hodnotu "nejbližší" reprezentovat. Jazyk QuickBasic pro systém MS-DOS podporuje standard a zaokrouhlí podle IEEE pravidla.

Také pamatujte na čísla, která mohou být zastoupeny v IEEE jsou umístěny na velmi široké. Si lze představit na číslo řádku. Existuje vysoká hustota reprezentovat čísel poblíž 1.0 a-1.0, ale méně a méně průběžně směrem k 0 nebo nekonečno.

Cílem tohoto standardu IEEE, který je určen pro strojírenství výpočty, je maximalizovat přesnost (získat co nejblíže k skutečný počet). Přesnost odkazuje na počet číslic, které může představovat. Vyvážení počet pokusů o standard IEEE BITS je vyhrazen pro exponent se počet bitů použitých pro desetinná část čísla, zajistit správnost a přesnost v přijatelných mezích.

Podrobnosti IEEE

Čísla s plovoucí desetinnou čárkou jsou reprezentována v následující formě, kde [exponent] je binární exponent:
   X =  Fraction * 2^(exponent - bias)
				

[Zlomek] je normalizovaná desetinná část čísla, normalizované protože exponent upravena tak, aby vedoucí bit je vždy 1. Tak nemá být uložen, a dostanete jeden další bit přesnost. Z tohoto důvodu je implicitního bitu. Si lze představit to jako matematický zápis, kde ovládáte exponent k mít jednu číslici vlevo od desetinné čárky, s výjimkou binární soubor, který vždy manipulovat exponent, tak, aby první bit 1, neboť existují pouze jedničky a nuly.

[] je hodnota posunu používaná bez nutnosti ukládat záporné exponentů.

Pro čísla s jednoduchou přesností je 127 a 1023 pro (desítkově) čísla s dvojitou přesností.

Hodnoty rovnající se všechny 0 a všechny 1 (binární) jsou vyhrazeny pro představující zvláštní případy. Existují také další speciální případy označují různé podmínky došlo k chybě.

Příklady jednoduchá přesnost

2 = 1 * 2 ^ 1 = 0100 0000 0000 0000... 0000 0000 = 4000 0000 hex
Poznámka: znaménkový bit je nula a uložené exponent je 128, nebo 100 0000 0 v binárním, což je 127 plus 1. Uložené mantisa je (1). 000 0000... 0000 0000, která má předpokládaných úvodní 1 a binární bodu, takže skutečné mantisa je 1.

-2 = -1 * 2 ^ 1 = 1100 0000 0000 0000... 0000 0000 = C000 0000 hex
Stejný jako + 2, že je nastaven bit znak. To platí pro všechny IEEE formát čísel s plovoucí desetinnou čárkou.

4 = 1 * 2 ^ 2 = 0100 0000 1000 0000... hex 0000 0000 = 4080-0000
Stejné mantisy, exponent zvýší o 1 (vyváženého hodnota je 129, nebo 100 0000 1 v binárním.

6 = 1.5 * 2 ^ 2 = 0100 0000 1100 0000... 0000 0000 = 40 C 0 0000 hex
Stejné exponent, mantisa je větší o polovinu – je (1.) 100 0000... 0000 0000, který, protože to je binární zlomek, je 1-1/2 (desetinnou jsou hodnoty 1/2 1/4, 1/8 atd.).

1 = 1 * 2 ^ 0 = 0011 1111 1000 0000... 0000 0000 = 3F80 0000 hex
Stejné exponent jako další pravomoci 2, mantisa je menší než 2 127 nebo 011 1111 1 binární.

0,75 = 1.5 * 2 ^ -1 = 0011 1111 0100 0000... 0000 0000 = 3F40 0000 hex
Je exponent vyváženého 126, 011 1111 0 v binární a mantisa (1.) 100 0000... 0000-0000, což je 1-1/2.

2.5 = 1,25 * 2 ^ 1 = 0100 0000 0010 0000... 0000 0000 = 4020 0000 hex
Stejně jako s výjimkou 2, který je bit, což představuje 1/4 Nastavte v mantise.

0,1 = 1.6 * 2 ^ -4 = 0011 1101 1100 1100... 1100, 1101 = 3DCC CCCD hex
1/10 je opakováním frakce v binárním. Mantisa je právě shy v bodu 1.6 a vyváženého exponent říká, že se vydělí 1.6 16 (je 011 1101 1 v binárním, což je 123 v desítkové soustavě). Hodnotu true. Exponent je 123-127 = - 4, což znamená, že faktor kterým násobení je 2 ** -4 = 1/16. Všimněte si, že uložené mantisa zaokrouhlí nahoru v poslední bit. To je pokus o představují unrepresentable číslo co nejpřesněji. (Důvod, 1/10 a 1/100 jsou přesně reprezentovat binární podobné Způsob 1/3, je přesně reprezentovat desetinné.)

0 = 1.0 * 2 ^ -128 = všechny nuly--zvláštní případ.

Ostatní běžné chyby s plovoucí desetinnou čárkou

Běžné chyby s plovoucí desetinnou čárkou jsou následující:
  1. Chyby zaokrouhlení

    Tato chyba výsledkem v případě, že nelze všechny bity v binární číslo použít ve výpočtu.

    Příklad: Přidání 0,0001 na 0.9900 (jeden přesnost)

    Desítkové číslo 0,0001 budou zastoupeny jako:
    10100011011011100010111 (1). * 2^(-14+Bias) (13 vedoucí 0s v Binární!)
    0.9900 budou zastoupeny jako:
    11111010111000010100011 (1). * 2^(-1+Bias)
    Nyní skutečně přidání těchto čísel, musí oddělovače desetinných míst (binární) zarovnání. To musí být Unnormalized. Zde je výsledné doplnění:
           .000000000000011010001101 * 2^0  <- Only 11 of 23 Bits retained
          +.111111010111000010100011 * 2^0
          ________________________________
           .111111010111011100110000 * 2^0
    
    						
    To se nazývá chyby zaokrouhlení, protože některé počítače kulaté, kdy Posunutí pro sčítání. Ostatní jednoduše zkrátit. Jsou chyby zaokrouhlení důležité zvážit vždy, když přidáváte nebo vynásobí dvě velmi odlišné hodnoty.
  2. Po odečtení hodnoty dvou téměř stejné hodnoty
           .1235
          -.1234
           _____
           .0001
    
    						
    To bude normalizovat. Všimněte si, že ačkoli původní čísla Každý měl čtyři platných číslic, výsledek obsahuje pouze jeden významné číslice.
  3. Přetečení a podtečení

    V případě, že výsledkem je příliš velké nebo příliš malé, aby zastoupena datového typu.
  4. Chyba quantizing

    Této situaci dochází ta čísla, které nelze znázornit v přesné formulář s plovoucí desetinnou čárkou standardu.
  5. Velmi malý počet dělení

    To může vyvolat chybu "dělení nulou" nebo může způsobit chybná výsledky jako v následujícím příkladu:
          A = 112000000
          B = 100000
          C = 0.0009
          X = A - B / C
    
    						
    V jazyk QuickBasic pro systém MS-DOS X nyní má hodnotu 888887, namísto Správná odpověď 900000.
  6. Výstupní chyby

    Této chybě dochází při výstupu funkce změnit hodnoty, které právě pracujete.

Vlastnosti

ID článku: 42980 - Poslední aktualizace: 23. dubna 2011 - Revize: 5.0
Informace v tomto článku jsou určeny pro produkt:
  • 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
Klíčová slova: 
kbmt KB42980 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:42980
Právní omezení pro obsah znalostní báze týkající se produktů, jejichž podpora byla ukončena
Tento článek byl napsán o produktech, pro které společnost Microsoft již neposkytuje nadále podporu. Článek je tedy nabízen v takovém stavu, v jakém je, a nebude již nadále aktualizován.

Dejte nám zpětnou vazbu

 

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