(Täielik) Õpetus aru saada IEEE ujukoma tõrked

Aegunud teabebaasisisu lahtiütlus

See artikkel käsitleb selliseid tooteid, millele Microsoft enam tugiteenuseid ei paku. Seetõttu esitatakse selle artikli teave „olemasoleval kujul“ ja edaspidi seda ei värskendata.

Kokkuvõte

Ujukoma matemaatika on keeruline teema, mida paljud programmeerijad segadust. Allpool õpik peaks aitama teil tuvastada programmeerimise olukordades, kus ujukoma tõrked võivad ilmneda ja kuidas neid vältida. See peaks võimaldama ka juhtudel, mis on põhjustatud omane ujukoma math piirangud erinevalt tegelik kompilaator vead tuvastada.

Lisateabe saamiseks

Decimal ja binaarne Number süsteemid

Tavaliselt me lugeda asju põhiline 10. Baas on täielikult. Ainus põhjus, et inimesed on traditsiooniliselt kasutanud põhiline 10, et nad on teinud inventuuri tööriistade 10 sõrme.


Number 532.25 decimal (baas 10) tähendab järgmist:

   (5 * 10^2) + (3 * 10^1) + (2 * 10^0) + (2 * 10^-1) + (5 * 10^-2)
500 + 30 + 2 + 2/10 + 5/100
_________
= 532.25


Kahendsüsteemi (alus 2), iga veeru tähistab power 2 asemel 10. Näiteks numbri 101.01 tähendab järgmist:

   (1 * 2^2) + (0 * 2^1) + (1 * 2^0) + (0 * 2^-1) + (1 * 2^-2)
4 + 0 + 1 + 0 + 1/4
_________
= 5.25 Decimal


Kuidas täisarvud esitatakse arvutid

Sellepärast, et ükski osaline osa täisarv, oma arvuti esinduse on palju lihtsam, kui see on ujukoma väärtused. Tavaline täisarvud personaalarvutites (arvutid) on 2 baiti (16 bitti) pikalt bitt näitab märk. Pikad täisarvud on 4 baiti pikk. Positiivsed väärtused on lihtne binaarne numbrid. Näiteks:

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


Negatiivsed täisarvud esitatakse, kasutades nende kahe süsteemi täiendada. Nende kahe täiendus kujutis negatiivne numbri saamiseks võtta binaarne esitus for the number absoluutväärtus ja Pööra kõik osad ja lisage 1. Näiteks:

   4 Decimal = 0000 0000 0000 0100
1111 1111 1111 1011 Flip the Bits
-4 = 1111 1111 1111 1100 Add 1


Pange tähele, et -1 Decimal = 1111 1111 1111 1111 binaarne, mis seletab, miks Basic käsitleb -1 loogiline tõene (kõik BITS-i = 1). See on tagajärg ei ole eraldi ettevõtjate bitwise ja loogiline võrdlus. Basic, on sageli mugavam kasutada koodi fragment väiksem kui teie programm teeb palju loogiline võrrelda. See aitab oluliselt loetavuse.

   CONST TRUE = -1
CONST FALSE = NOT TRUE


Pange tähele, et lisada mis tahes kombinatsioon kahe aasta täiendavad numbrid koos kasutades tavalise binaarne aritmeetiline annab õige tulemuse.

Ujukoma tüsistused

Iga kümnendarv saab täpselt esindab binaarne täisarv; kuid see ei ole täidetud osaline numbrid. Tegelikult iga number, mis on irratsionaalne põhiline 10 on ka irratsionaalne igal süsteemi baasi, mis on väiksem kui 10.


Binaarne, eriti ainult osaline numbrid, mida ei saa esitada vormi p/k, kus k on täisarv power 2, võib esitada täpselt, piiratud arvu bitti.


Isegi levinud kümnendmurde decimal 0,0001, näiteks ei saa esindab täpselt binaarne. (0,0001 on korduv binaarne murd periood 104 bitti!)


See seletab, miks lihtsa näite, näiteks järgmisi

   SUM = 0
FOR I% = 1 TO 10000
SUM = SUM + 0.0001
NEXT I%
PRINT SUM ' Theoretically = 1.0.


Prindi 1.000054 on võrdsed. Väike viga ehk 0,0001 binaarne levib summa.


Samal põhjusel alati olge väga ettevaatlik tegemisel võrdlused real numbrid. Järgmine näide illustreerib ühise programmeerimise tõrge:

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


See ei PRINDITA "Võrdne!", kuna 69.82 ei saa esindab täpselt binaarne, mis põhjustab väärtus, mis tuleneb olla VEIDI erinevad (binaarne) loovutamise kui väärtus, mis saadakse avaldis. Tegelikult peaks alati koodi sellised võrdlused nii, et võimaldada teatud olukord. Näiteks:

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


See PRINT "Equal".

IEEE arvuvormingu

QuickBasic MS-DOS-i versiooni 3.0 oli tarnitakse MBF (Microsofti Binary Floating Point) versioon ja IEEE (Institute of Electrical and Electronics Engineers) versioon koos math coprocessor arvutite jaoks. QuickBasic jaoks MS-DOS-i versiooni 4.0 ja uuemad kasutada ainult IEEE. Microsofti valitud standardit IEEE praegune versioon Basic ujukoma väärtuste esitamiseks kolm esmane järgmistel põhjustel:

  1. Et Basic kasutama Intel math kaasprotsessoreid, mille jaoks IEEE vormingus. Intel 80 x 87 seeria kaasprotsessoreid ei tööta koos Microsoft binaarvorming numbrid.
  2. Vahekeele helistada Basic, C, Pascal, FORTRAN ja MASM palju lihtsam teha. Vastasel juhul oleks teisendamine rutiin saata arvuliste väärtuste ühest keelest teise.
  3. Et saavutada järjepidevus. IEEE on aktsepteeritud tööstuse standard C ja FORTRAN kompilaatoreid.
Kiire võrdlus IEEE ja MBF lubadusi täpsusega number on järgmine:

               Sign Bits   Exponent Bits   Mantissa Bits
--------- ------------- -------------
IEEE 1 11 52 + 1 (Implied)
MBF 1 8 56


Lisateavet erinevuste IEEE ja MBF ujukoma esitus päringu Microsofti teabebaasi artikli kuvamiseks järgmisi sõnu:

   IEEE and floating and point and appnote


Pange tähele, et IEEE pühendatud aste, mis võimaldab suurema hulga väärtused esindavad rohkem bitte. MBF on rohkem loogikaseadme bitti, mis võimaldab täpsemalt selle kitsamaks vahemikus.

Üldine ujukoma mõisted

See on väga oluline mõista, et ühtegi binaarne ujukoma süsteemi võib tähistada ainult piiratud hulk ujukoma täpse vormi väärtusi. Kõik väärtused tuleb ühtlustada lähima esinduslikud väärtus. IEEE standard määrab ümardamine väärtused "lähim" esinduslikud väärtuse meetod. QuickBasic MS-DOS-i toetab standardit ja IEEE õigekirjareeglite järgi ringi.


Samuti pidage meeles, mis numbrid, mida ei saa esitada IEEE jaotada väga laia valikut. Neid võib kujutada rea number. Kõrgtihedusega esinduslikud numbreid 1.0 ja -1,0, kuid vähem ja vähem nii, nagu minema 0 või lõpmatusse.


IEEE standard, mis on mõeldud ehitus arvutused, eesmärgiks on suurendada täpsust (saada võimalikult tegelikule number). Precision viitab number numbrid, mis võib tähistada. IEEE standard püüab tasakaalustada koos kasutatakse osaline osa number, täpsust ja täpsuse aktsepteeritav piires bittide arv on aste spetsiaalne bittide arv.

IEEE üksikasjad

Ujukoma arve esitatakse järgmisel kujul, kus [aste] on binaarne aste:

   X =  Fraction * 2^(exponent - bias)


[Osa] on normeeritud osaline osa number, normaliseeritud, kuna see aste on kohandatud nii, et juhtivate bit on alati 1. Sel viisil ei on salvestada ja teil tekib üks rohkem natuke täpsust. See on põhjus, miks kaudsetest bit. Mõelge see eksponentkuju, nagu kus manipuleerida aste on üks number vasakule koma, välja arvatud binaarne, saate alati käsitseda ning aste nii, et esimene on 1, sest üksnes 1s ja 0s.


[nihkega] on vältida negatiivset Messibokse talletamiseks kasutatav diagonaal väärtus.


Nihkega ühe täpsus numbrid on 127 ja täpsusega numbritele (kümnendarv) 1023.


Väärtused, mis on võrdne kõik 0 ja 1 (binaarne) on reserveeritud esindavad erijuhtudel. Puuduvad muud erijuhtudel ka, mis näitavad erinevate tõrke tingimustega.

Ühe Precision näited

2 = 1 * 2 ^ 1 = 0100 0000 0000 0000... 0000 0000 = 4000 0000 hex
Märkus sisselogimise natuke null ja salvestatud aste on 128 või 100 0000 0 binaarne, mis on 127 pluss 1. Salvestatud loogikaseadme on (1.) 000 0000... 0000 0000, mis on mõne kaudsetest juhtivate 1 ja binaarne punkti, nii tegelik loogikaseadme on 1.

-2 = -1 * 2 ^ 1 = 1100 0000 0000 0000... 0000 0000 = C000 0000 hex
Sama olukord nagu + 2 märk bitt. See puudutab kõiki IEEE vormingus ujukoma numbrid.

4 = 1 * 2 ^ 2 = 0100 0000 1000 0000... 0000 0000 = 4080 0000 hex
Sama loogikaseadme aste suureneb ühe (kallutatud väärtus on 129 või 100 0000 1 binaarne.

6 = 1,5 * 2 ^ 2 = 0100 0000 1100 0000... 0000 0000 = 40C 0 0000 hex
Sama aste loogikaseadme maht poole võrra – see on (1.) 100 0000... 0000 0000, kuna see on binaarne murd on 1-1/2 (osaline numbrit väärtused on 1/2, 1/4, 1/8 jne.).

1 = 1 * 2 ^ 0 = 0011 1111 1000 0000... 0000 0000 = 3F80 0000 hex
Sama nimega muid volitusi 2 aste, loogikaseadme on väiksem kui 2 127 või 011 1111 1 binaarne.

.75 = 1,5 * 2 ^ -1 = 0011 1111 0100 0000... 0000 0000 = 3F40 0000 hex
Kallutatud aste on 126, 011 1111 0 loendis binaarne ja siis loogikaseadme on (1.) 100 0000... 0000 0000, mis on 1-1/2.

2.5 = 1,25 * 2 ^ 1 = 0100 0000 0010 0000... 0000 0000 = 4020 0000 hex
Täpselt nagu 2, välja arvatud tähistava 1/4 bit on määratud see loogikaseadme.

0,1 = 1,6 * 2 ^ -4 = 0011 1101 1100 1100... 1100 1101 = 3DCC CCCD hex
1/10 on korduv murd on binaarne. Selle loogikaseadme on lihtsalt häbelik 1.6 ja kallutatud aste ütleb, et 1.6 on jagatud 16 (see on 011 1101 1 binaarne 123 kümnendsüsteemis). Täidetud aste on 123-127 = - 4, mis tähendab, et, mis korrutatakse teguriga 2 ** -4 = 1/16. Pange tähele, et salvestatud loogikaseadme on ülespoole viimase bitiga. See on katse näitab, mitu unrepresentable täpselt. (Põhjus, miks see 1/10 ja 1/100 ei ole täpselt esinduslikud binaarne sarnaneb nii, et 1/3 ei ole täpselt esinduslikud kümnendsüsteemis.)

0 = 1.0 * 2 ^-128 = kõik nullid--erijuhtum.

Muude sagedasemad ujukoma tõrked.

Järgnevad sagedasemad ujukoma tõrked.

  1. Ümardamine viga


    See tõrge tulemusi, kui kõik bitid binaarne number ei saa kasutada arvutus.


    Näide: Lisamine 0,0001-0.9900 (ühe täpsus)


    Decimal 0,0001 näidatakse arvuna:
    (1.) 10100011011011100010111 * 2^(-14+Bias) (13 viib 0s binaarne!)
    0.9900 on arvuna:
    (1.)11111010111000010100011 * 2^(-1+Bias)
    Nüüd need numbrid tegelikult lisamiseks decimal (binaarne) punktid tuleb kooskõlla. Selleks tuleb Unnormalized. Siin on saadud:
           .000000000000011010001101 * 2^0  <- Only 11 of 23 Bits retained
    +.111111010111000010100011 * 2^0
    ________________________________
    .111111010111011100110000 * 2^0


    Seda nimetatakse ümardamine viga, kuna Mõnedel arvutitel ringi kui muutmine lisamine. Teised lihtsalt kärpima. Ümardamine viga on oluline kaaluda siis, kui lisate või korrutatakse kaks väga erinevat väärtust.
  2. Lahutamisel kaks peaaegu võrdne väärtused
           .1235
    -.1234
    _____
    .0001


    See on normaliseeritud. Pange tähele, et kuigi algse arve koosneb neljast numbrist, tulemus on ainult üks oluline number.
  3. Ületäitumise ja underflow


    See juhtub siis, kui tulemus on liiga suur või liiga väike esindaja poolt andmete tüüp.
  4. Quantizing tõrge


    See juhtub need numbrid, mida ei saa esitada täpne vormis ujukoma standard.
  5. Osakonna väike numbri järgi


    See võib põhjustada "jagamine nulliga" tõrge või kes suudab halba, nagu järgmises näites:
          A = 112000000
    B = 100000
    C = 0.0009
    X = A - B / C


    Klõpsake QuickBasic MS-DOS-i nüüd X on väärtus 888887, selle asemel, et õige vastuse 900000.
  6. Väljund viga


    Seda tüüpi tõrge ilmneb siis, kui väljund funktsioone muuta töötamisel väärtused.
Atribuudid

Artikli ID: 42980 – viimati läbi vaadatud: 26. jaan 2017 – redaktsioon: 1

Tagasiside