(Dokončit) Kurz k pochopení chyby s plovoucí desetinnou čárkou IEEE

Prohlášení o odmítnutí odpovědnosti pro už nepodporovaný obsah KB

Tento článek byl napsán pro produkty, ke kterým již Microsoft nadále nenabízí podporu. Článek je tedy poskytován „tak, jak je“ a nebude už nadále aktualizován.

Souhrn

Matematika s plovoucí desetinnou čárkou je složité téma, které confuses mnoho programátory. Kurz níže by měl pomoci rozpoznat programování situací, kde se může vyskytnout chyby s plovoucí desetinnou čárkou a jak jim zabránit. Měla by také umožnit rozpoznat případy, které jsou způsobeny omezení spočívající matematiku s plovoucí desetinnou čárkou na rozdíl od skutečného kompilátoru chyby.

Další informace

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

Za normálních okolností můžeme počítat věci v základní 10. Báze je zcela libovolný. Lidé mají tradičně používá základní 10 je pouze, aby měli 10 prsty, které provedli užitečné nástroje počítání.


Číslo 532.25 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


V systému číslo binární (základ 2) každý sloupec představuje napájení 2 namísto 10. Například číslo 101.01 znamená 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é číslo, jeho znázornění stroj je mnohem jednodušší, než je pro hodnoty s plovoucí desetinnou čárkou. Na osobní počítače (PC) normální celá jsou 2 bajty (16 bitů) s nejvýznamnější bit označující znaménko dlouhý. Dlouhá celá čísla jsou dlouhý 4 bajty. Kladné hodnoty jsou jednoduché binární čísla. Například:

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


Nicméně záporné celočíselné hodnoty jsou reprezentovány pomocí dvou jeho doplňkem. K získání dvou jeho doplňkem reprezentace pro záporné číslo, vezměte binární reprezentaci pro absolutní hodnotu daného čísla a Převrátit 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 -1 jsou považovány za logickou hodnotu true (všechny bity = 1). To je důsledkem nemají oddělené operátory pro porovnání bitové operace a logické. V Basic, je často vhodné použít fragment kódu pod váš program bude při provádění mnoha logických porovnání. Toto je velmi výhodné čitelnost.

   CONST TRUE = -1
CONST FALSE = NOT TRUE


Všimněte si, že přidání libovolnou kombinaci dvou na doplnění společně s použitím běžných aritmetický binární čísla vytváří 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 systému na bázi menší než 10 nenormální.


Pro binární zejména pouze desetinná čísla, která může být reprezentována v formuláři p/q, kde q je celočíselná mocnina 2, může být vyjádřen přesně s konečný počet bitů.


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


To vysvětluje, proč jednoduchý příklad, jako například následující

   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 buďte vždy velmi opatrní při provedení porovnání v reálných hodnotách. Následující příklad ukazuje společné programování Chyba:

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


To není VYTISKNE "Rovnost!" protože 69.82 nelze reprezentovat přesně v binárním, což způsobí hodnotu výsledky z přiřazení MÍRNĚ lišit (v binárním) než hodnota, která je generována z výrazu. V praxi by měl vždy kód takové srovnání v tak, aby pro určitá odchylka. Například:

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


To bude TISKNOUT "Stejný".

IEEE formát čísel

Jazyk QuickBasic pro MS-DOS verze 3.0 byla dodána s MBF (Binary aplikace Microsoft Floating Point) verzi a verzi IEEE (Institute of Electrical and Electronics Engineers) pro počítače s matematický koprocesor. Jazyk QuickBasic pro MS-DOS, verze 4.0 a novější pouze pomocí IEEE. Microsoft zvolili standard IEEE představovat hodnoty s plovoucí desetinnou čárkou v aktuální verze Basic pro následující tři hlavní důvody:

  1. Chcete-li povolit Basic používat matematické coprocessors Intel, které používají formát IEEE. Série 80 x 87 coprocessors Intel nemůže pracovat s Microsoft binární formát čísla.
  2. Chcete-li interlanguage volání mezi Basic, C, Pascal, FORTRAN a MASM mnohem jednodušší. Převodní rutiny, jinak by musel použít k odeslání číselné hodnoty z jednoho jazyka do jiného.
  3. K dosažení konzistence. IEEE je standardní C a FORTRAN kompilátory přijaté.
Rychlé porovnání IEEE a MBF znázornění číslo s dvojitou přesností, je následující:

               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 plovoucí znázornění, dotaz do znalostní báze společnosti Microsoft na následující slova:

   IEEE and floating and point and appnote


Všimněte si, že IEEE má více bitů vyhrazen pro exponent, který umožňuje zastupovat širší rozsah hodnot. MBF – má více bitů mantisy, což umožňuje přesnější v jeho dosahu užší.

Obecné koncepty s plovoucí desetinnou čárkou

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


Také mějte na paměti, že čísla, která mohou být prezentována v IEEE jsou umístěny na velmi široké. Si je představit na číslo řádku. Vysoká hustota reprezentovat čísla blízko 1.0 a-1.0 je ale méně a méně, jak jste jít směrem k 0 nebo nekonečna.


Cílem tohoto standardu IEEE, který je určen pro technické výpočty, je maximalizovat přesnost (získat co nejblíže ke skutečné číslo). Přesnost odkazuje na počet číslic, které mohou představovat. IEEE standard se pokusí nalézt rovnováhu mezi počtem bitů exponentu věnuje se počet bitů použitých pro desetinnou část čísla, aby 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 být] je binární exponent:

   X =  Fraction * 2^(exponent - bias)


[Část] je normalizovaná zlomková část čísla protože exponent upravena tak, aby vedoucí bit je vždy 1. Tímto způsobem nemusí být uložen a získat jeden další platný bit. To je důvod existence implicitního bitu. Si lze představit to jako matematický zápis, kde ovládáte exponent a jednu číslici vlevo od desetinné čárky, s výjimkou binární že exponent může vždy manipulovat tak, aby první bit 1, protože pouze 1s a 0s.


[posun] je hodnota posunu používaná vyhnout se ukládání záporných exponentů.


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


Na všechny 0 a všechny 1 (binární) jsou vyhrazeny pro představující zvláštní případy. Existují další speciální případy, které označují různé chybové stavy.

Příklady jednoduchá přesnost

2 = 1 * 2 ^ 1 = 0100 0000 0000 0000... hex 0000 0000 0000 = 4000
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. (1.) je uložené mantisa 000 0000... 0000 0000, který má na předpokládané úvodní 1 a binární bod, takže skutečné mantisa je 1.

-2 = -1 * 2 ^ 1 = 1100 0000 0000 0000... 0000 0000 = C000 0000 hex
Stejný jako + 2 s tím rozdílem, že je znaménkový bit nastaven. To platí pro všechna čísla s plovoucí desetinnou čárkou IEEE formátu.

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

6 = 1.5 * 2 ^ 2 = 0100 0000 1100 0000... 0000 0000 = 40C 0 0000 hex
Stejné exponent mantise je větší o polovinu – je to (1.) 100 0000... 0000 0000, což vzhledem k tomu, že toto je binární zlomek je 1-1/2 (hodnoty zlomkové číslice jsou 1/2, 1/4, 1/8, atd.).

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

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

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

0,1 = 1.6 * 2 ^ -4 = 0011 1101 1100 1100... Hex CCCD 1100 1101 = 3DCC
1/10 je opakováním frakce v binárním. Mantisa je právě tvy 1,6 a vyváženého exponent říká, že se vydělí 16 1.6 (je 1 011 1101 v binárním, což je 123 v desítkové soustavě). 123-127 je true exponent = - 4, což znamená, že je koeficient, kterým chcete násobit 2 ** -4 = 1/16. Všimněte si, že uložené mantisa zaokrouhleno 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ýsledky při všechny bity v binární číslo nelze použít ve výpočtu.


    Příklad: Přidání 0.0001 k 0.9900 (jeden přesnost)


    Desítkové číslo 0,0001 budou zastoupeny jako:
    (1.) 10100011011011100010111 * 2^(-14+Bias) (13 vedoucí 0s v binární!)
    0.9900 budou zastoupeny jako:
    (1.)11111010111000010100011 * 2^(-1+Bias)
    Nyní skutečně přidání těchto čísel, musí být zarovnány oddělovače desetinných míst (binární). To musí být Unnormalized. Zde je výsledný sčítání:
           .000000000000011010001101 * 2^0  <- Only 11 of 23 Bits retained
    +.111111010111000010100011 * 2^0
    ________________________________
    .111111010111011100110000 * 2^0


    Vzhledem k tomu, že některé počítače zaokrouhlit k posunu pro sčítání, to se nazývá chyby zaokrouhlení. Ostatní jednoduše zkrátit. Chyby zaokrouhlení jsou 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. Poznámka: Ačkoli původní čísla obsahuje čtyři platné číslice, výsledek obsahuje pouze jednu platnou číslici.
  3. Přetečení a podtečení


    K tomu dochází, pokud výsledek je příliš velké nebo příliš malé a nelze podle datového typu.
  4. Quantizing chyba


    Této situaci dochází u těchto čísel, které nelze reprezentovat v přesném tvaru dle standardu s plovoucí desetinnou čárkou.
  5. Dělení velmi malé číslo


    To může aktivační událost Chyba "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 MS-DOS X nyní má hodnotu 888887, namísto správných odpovědí 900000.
  6. Výstupní chyby


    Této chybě dochází při výstupu funkce změnit hodnoty, které budou pracovat s.
Vlastnosti

ID článku: 42980 - Poslední kontrola: 16. 1. 2017 - Revize: 1

Váš názor