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

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.
Souhrn
Matematika s plovoucí desetinnou čárkou je složité téma, které mnoho confusesProgramátoři. Kurz níže by vám rozpoznat programovánísituacích, kdy jsou pravděpodobnější s plovoucí desetinnou čárkou chyby a jakVyhněte se jim. Měla by také umožnit rozpoznatelný případy, které jsouzpůsobené omezení spojená s plovoucí desetinnou čárkou math oprotiKompilá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 zcelalibovolný. Jediným důvodem, že lidé mají tradičně base10 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á, žená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 seNejvý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ěkschéma. Chcete-li získat dva jeho doplňkem znázornění negativníčíslo, trvat binární reprezentaci pro absolutní hodnotu čísloPř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ětlujeProč Basic považuje za logickou hodnotu PRAVDA -1 (všechny bity = 1). Jedná seDůsledkem bez nutnosti oddělené operátory bitového a logicképorovnání. Často Basic, je vhodné použít fragment kódupod program bude při provádění mnoha logických porovnání. Tovelmi 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ýtkde 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,0001zastoupeny v binárním přesně. (0,0001 je periodický binární zlomeks 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,0001v 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 ukazujeběž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.82přesně v binárním, což způsobuje, že hodnotu, která je výsledkempřiřazení se MÍRNĚ liší (binární) než je hodnota, která jegenerované z výrazu. V praxi by měla vždy kódutakové srovnání takovým způsobem, aby některé odchylky. ProPří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 MBFVerze (Microsoft binární plovoucích bod) a IEEE (Institute ofVerze Electrical and Electronics Engineers) pro počítače sMatematický koprocesor. Jazyk QuickBasic pro MS-DOS verze 4.0 a vyššípouze pomocí IEEE. Microsoft zvolili představovat standardu IEEEhodnoty 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 MBFreprezentace s plovoucí desetinnou čárkou, dotaz v databázi Microsoft Knowledge Base naNá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žňujeChcete-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 čárkoumůž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ížeHodnota reprezentovat. IEEE standard určuje metodu proZaokrouhlení hodnoty na hodnotu "nejbližší" reprezentovat. Jazyk QuickBasicpro systém MS-DOS podporuje standard a zaokrouhlí podle IEEEpravidla.

Také pamatujte na čísla, která mohou být zastoupeny v IEEEjsou umístěny na velmi široké. Si lze představit načíslo řádku. Existuje vysoká hustota reprezentovat čísel poblíž 1.0a-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 kskutečný počet). Přesnost odkazuje na počet číslic, kterémůže představovat. Vyvážení počet pokusů o standard IEEEBITS je vyhrazen pro exponent se počet bitů použitých prodesetinná část čísla, zajistit správnost a přesnostv 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ždy1. Tak nemá být uložen, a dostanete jeden další bitpřesnost. Z tohoto důvodu je implicitního bitu. Si lze představitto jako matematický zápis, kde ovládáte exponent kmí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 propředstavující zvláštní případy. Existují také další speciální případyoznač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.
1.00 2.00 3.00 4.00 4.00b 4.50 6.00 6.00b IEEETUTR 7.00 7.10

Upozornění: Tento článek je přeložený automaticky

Vlastnosti

ID článku: 42980 - Poslední kontrola: 04/23/2011 17:51:00 - Revize: 5.0

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

  • kbmt KB42980 KbMtcs
Váš názor