Yritän laskea mini- / maksimiarvon tai alimman ja suurimman arvotason 48-bittisessä liukulukutyypissä MIL-STD-1750A (PDF) (WIKI) .
Esimerkki: kuinka kaksinkertainen alue on 1.7E +/- 308
Olen etsinyt yhtälöitä ja en ole varma, toimiiko löytämäni.
Ensimmäinen löytämäni yhtälö oli
En ole aivan varma, mistä aloittaa nämä, jos ne ovat edes oikeassa siinä, mitä tarvitsen.
Antaako joku minulle tietonsa ja auttaa ratkaisemaan tämän?
Kommentit
Vastaa
32-bittisen liukuluvun maksimiarvo näkyy taulukossa III:
0.9999998 x 2^127 represented in hex as: mantissa=7FFFFF, exponent=7F.
Me voi hajottaa mantissan / eksponentin (lähellä) desimaaliarvoon seuraavasti:
7FFFFF <base-16> = 8,388,607 <base-10>.
Merkitsevää bittiä on 23, joten jaamme 8 388 607 2: lla 23 .
8,388,607 / 2^23 = 0.99999988079071044921875 (see Table III)
eksponenttiin asti:
7F <base-16> = 127 <base-10>
ja nyt kerrotaan mantissa 2 ^ 127 (eksponentti)
8,388,607 / 2^23 * 2^127 = 8,388,607 * 2^104 = 1.7014116317805962808001687976863 * 10^38
Tämä on suurin 32-bittinen liukulukuarvo, koska käytetään suurinta mantissaa ja suurinta eksponenttia.
48-bittinen liukuluku lisää 16 bittiä vuokralle antajan merkitsevää mantissaa, mutta jättää eksponentin samankokoiseksi. Siten enimmäisarvo esitettäisiin heksadesimaalina
mansissa=7FFFFFFFFF, exponent=7F.
taas, voimme laskea
7FFFFFFFFF <base-16> = 549,755,813,887 <base-10>
suurin eksponentti on edelleen 127, mutta meidän on jaettava luvulla [23 + 16 = 39, joten:] 2 ^ 39. 127-39 = 88, joten kerro vain 2 ^ 88:
549,755,813,887 * 2^88 = 1.7014118346015974672186595864716 * 10^38
Tämä on suurin 48-bittinen liukuluku, koska käytimme suurinta mahdollista mantissaa ja suurin mahdollinen eksponentti.
Joten enimmäisarvot ovat:
1.7014116317805962808001687976863 * 10^38, for 32-bit, and, 1.7014118346015974672186595864716 * 10^38, for 48-bit
48-bittisen maksimiarvo on vain hieman suurempi kuin 32-bittiselle, mikä on järkevää, koska muutama bitti lisätään mantissan loppuun.
(Tarkemmin sanottuna 48-bittisen muodon enimmäismäärä voidaan ilmaista binäärilukuna, joka koostuu 39 1 ”: stä ja 88 0”: sta.)
(Pienin on vain tämän arvon negatiivinen. Lähin nolla ilman nollaa voidaan myös helposti laskea yllä olevan mukaisesti: käytä pienin mahdollinen (positiivinen) mantissa: 0000001 ja pienin mahdollinen eksponentti: 80 heksadesimaalilla tai -128 desimaalilla)
FYI
Jotkut liukulukumuodot käyttävät edustamatonta piilotettua 1
bitti mantissassa (tämä mahdollistaa yhden ylimääräisen tarkkuuden mantissassa, koska f ollows: Kaikkien numeroiden (paitsi 0 tai denormaalien, katso alla) ensimmäinen binäärinumero on 1
, joten meidän ei tarvitse tallentaa tätä 1
ja meillä on ylimääräinen tarkkuus). Tämä tietty muoto ei näytä tekevän tätä.
Muut liukulukuformaatit mahdollistavat denormalisoidun mantissan, joka antaa mahdollisuuden edustaa (positiivisia) pienempiä eksponentteja pienempiä lukuja vaihtamalla tarkkuuden bittejä ylimääräisten (negatiivisten) voimien saamiseksi. / 2. Tätä helppoa tukea, jos se ei tue myös piilotettua bittiä, hieman vaikeampi, jos se tukee.
8,388,607 / 2 ^ 23 on arvo, jonka saat mantissan kanssa = 0x7FFFFF ja eksponentti = 0x00. Se ei ole yksittäisen bitin arvo, vaan arvo, jossa on täysi mantissa ja neutraali tai tarkemmin sanottuna nolla eksponentti.
Syy, jonka vuoksi tämä arvo ei ole suoraan 8388607, vaatii jakamista (2 ^ 23: lla ja siten on vähemmän kuin mitä odotat) on, että oletettu radix-piste on mantissan etupuolella eikä sen jälkeen . Joten ajattele (merkkibitti, jota seuraa radix-piste, jota seuraa 23 1-bittiä) mantissalle ja +/- 111111111111 (ei radiksipistettä tässä, vain kokonaisluku, tässä tapauksessa 127 ) eksponentille.
mantissa = 0x7FFFFF, jonka eksponentti = 0x7F, on suurin arvo, joka vastaa arvoa 8388607 * 2 ^ 104, jossa 104 tulee kohdasta 127-23: jälleen vähentämällä 23 tehoa kahdesta, koska mantissa on radiksipiste alussa. Jos radiksipiste olisi lopussa, suurin arvo (0x7FFFFF, 0x7F) olisi todellakin 8 388 607 * 2 ^ 127.
Muun muassa on olemassa mahdollisia tapoja harkita yhden bitin arvoa mantissa. Yksi on mantissa = 0x400000 ja toinen on mantissa = 0x000001. ottamatta huomioon radiksipistettä tai eksponenttia, ensimmäinen on 4 194 304 ja jälkimmäinen on 1. Nolla-eksponentilla ja radiksipistettä ajatellen ensimmäinen on 0,5 (desimaali) ja jälkimmäinen on 0,00000011920928955078125. Suurimman (tai pienimmän) eksponentin avulla voimme laskea yksittäisen bitin maksimiarvot ja min.
(Huomaa, että jälkimmäistä muotoa, jossa mantissalla on etunollia, pidetään denormalisoituna joissakin lukumuotoissa, ja sen normalisoitu esitys olisi 0x400000 ja eksponentti -23).
Kommentit
- epäilen yhtä. Tekemällä 8 388 607/2 ^ 23 antaa sille, mitä yksi bitti mantissassa voi edustaa. Joten kuinka 8388607/2 ^ 23 * 2 ^ 127 edustaa enimmäisarvoa?
- @hariprasad, laitan vastaukseen postikirjan, koska sitä on liian vaikea selittää kommenttimuodossa.
- missä on vähimmäisarvo? sitä ' vaaditaan otsikossa!
- @CharlieParker, toisin kuin kokonaislukuesitykset, joissa min ja max on siirretty, liukulukuformaatit käyttävät merkkiä & suuruusesitykset, joissa suuruus koostuu eksponentista ja mantissasta. Merkkien suuruusluokkien suurin luku on silloin (1) positiivinen (merkkibitti on 0) ja (2) suurin mahdollinen eksponentti ja (3) suurin mahdollinen mantissa. Min-luku on identtinen: paitsi että merkkibitti muuttuu, joten se on (1) negatiivinen (merkkibitti on 1), mutta (2) suurin mahdollinen eksponentti ja (3) suurin mahdollinen mantissa. Kuten edellä selitin, min-luku on vain -max, joten heitä vain
-
-merkki.
Vastaa
Voit lainata siitä, miten IEEE-liukuluku on sijoitettu nopeaa vertailua varten: merkki, eksponentti, mantissa. kuitenkin tuossa PDF-tiedostossa näen, että mantissa ja eksponentti ovat päinvastaiset.
Tämä tarkoittaa, että vertailuun sinun on ensin tarkistettava merkkibitti ja jos yksi ei vielä ole voittaja, verrataan eksponentteja ja sitten verrataan mantissa.
Jos toinen on positiivinen ja toinen negatiivinen, positiivinen on suurin.
Jos molemmat ovat positiivisia ja yksi eksponentti on suurempi, se on max (jos molemmat ovat negatiivisia, niin se on min)
Vastaavasti mantissalle.
a<b?a:b
jaa>b?a:b