Pokouším se vypočítat min / max nebo rozsah nejnižší až nejvyšší hodnoty 48bitového typu s plovoucí desetinnou čárkou MIL-STD-1750A (PDF) (WIKI) .
Příklad: Jak funguje dvojitý rozsah je 1.7E +/- 308
Rozhlédl jsem se po rovnicích a nejsem si jistý, jestli to, co jsem našel, bude fungovat.
První rovnice, kterou jsem našel, byla
Nejsem si úplně jistý, kde s nimi začít, pokud jsou dokonce správné v tom, co potřebuji.
Poskytne mi někdo své znalosti a pomůže to vyřešit?
Komentáře
Odpověď
Pro 32bitovou plovoucí desetinnou čárku je maximální hodnota uvedena v tabulce III:
0.9999998 x 2^127 represented in hex as: mantissa=7FFFFF, exponent=7F.
We může rozložit mantisu / exponent na (zavřít) desítkovou hodnotu následujícím způsobem:
7FFFFF <base-16> = 8,388,607 <base-10>.
Existuje 23 důležitých bitů, takže 8 388 607 vydělíme 2 ^ 23 .
8,388,607 / 2^23 = 0.99999988079071044921875 (see Table III)
až k exponentu:
7F <base-16> = 127 <base-10>
a nyní vynásobíme mantisu o 2 ^ 127 (exponent)
8,388,607 / 2^23 * 2^127 = 8,388,607 * 2^104 = 1.7014116317805962808001687976863 * 10^38
Toto je největší 32bitová hodnota s plovoucí desetinnou čárkou, protože je použita největší mantisa a největší exponent.
48bitová plovoucí desetinná čárka přidává 16 bitů mantisy významnosti menšího, ale ponechává exponentu stejnou velikost. Maximální hodnota by tedy byla reprezentována v hexadecimu jako
mansissa=7FFFFFFFFF, exponent=7F.
opět můžeme vypočítat
7FFFFFFFFF <base-16> = 549,755,813,887 <base-10>
maximální exponent je stále 127, ale musíme jej vydělit [23 + 16 = 39, takže:] 2 ^ 39. 127-39 = 88, takže jen vynásobte 2 ^ 88:
549,755,813,887 * 2^88 = 1.7014118346015974672186595864716 * 10^38
Toto je největší 48bitová hodnota s plovoucí desetinnou čárkou, protože jsme použili největší možnou mantisu a největší možný exponent.
Takže maximální hodnoty jsou:
1.7014116317805962808001687976863 * 10^38, for 32-bit, and, 1.7014118346015974672186595864716 * 10^38, for 48-bit
Maximální hodnota pro 48bit je jen o něco větší než pro 32-bit, což má své opodstatnění, protože na konec mantisy je přidáno několik bitů.
(Přesně, maximální počet pro 48bitový formát lze vyjádřit jako binární číslo, které skládá se z 39 1 s následovaných 88 0 s.)
(Nejmenší je pouze zápor této hodnoty. Nejbližší k nule, aniž by byla nula, lze také snadno vypočítat podle výše uvedeného: použijte nejmenší možná (kladná) mantisa: 0000001 a nejmenší možný exponent: 80 v hexadecimálním formátu nebo -128 v desítkové soustavě)
FYI
Některé formáty s plovoucí desetinnou čárkou používají nezastoupený skrytý 1
bit v mantisě (to umožňuje další bit přesnosti v mantisě, protože f ollows: první binární číslice všech čísel (kromě 0 nebo denormálů, viz níže) je 1
, proto ji nemusíme ukládat 1
a máme trochu přesnosti). Zdá se, že tento konkrétní formát to nedělá.
Jiné formáty s plovoucí desetinnou čárkou umožňují denormalizovanou mantisu, která umožňuje reprezentovat (kladná) čísla menší než nejmenší exponent, obchodováním s precizností pro další (záporné) síly ze 2. Tato snadná podpora, pokud nepodporuje ani skrytý bit, o něco těžší, pokud ano.
8 388 607/2 ^ 23 je hodnota, kterou získáte pomocí mantisy = 0x7FFFFF a exponent = 0x00. Nejedná se o jedinou bitovou hodnotu, ale spíše o hodnotu s plnou mantisou a neutrální, nebo konkrétněji nula exponent.
Důvod, proč tato hodnota není přímo 8388607, a vyžaduje dělení (o 2 ^ 23, a proto je menší než byste čekali) je, že implikovaný radix point je v přední části mantisy, spíše než po ní. Takže zvažte (znaménkový bit, za kterým následuje radixový bod, následovaný třiadvaceti 1 bity) pro mantisu a +/- 11111111111111 (zde žádný radixový bod, pouze celé číslo, v tomto případě ) pro exponenta.
mantissa = 0x7FFFFF s exponentem = 0x7F je největší hodnota, která odpovídá 8388607 * 2 ^ 104, kde 104 pochází z 127-23: opět odečtením 23 mocnin dvou, protože mantisa má bod radixu na začátku. Pokud by byl radixový bod na konci, pak by největší hodnota (0x7FFFFF, 0x7F) byla skutečně 8 388 607 * 2 ^ 127.
Mimo jiné existují možné způsoby, jak můžeme uvažovat o jediné bitové hodnotě pro mantisa. Jeden je mantisa = 0x400000 a druhý je mantisa = 0x000001. bez uvažování bodu radixu nebo exponentu, první je 4,194,304 a druhý je 1. S nulovým exponentem a vzhledem k bodu radixu je první 0,5 (desítkově) a druhý 0,00000011920928955078125. S maximálním (nebo minimálním) exponentem můžeme vypočítat maximální a minimální jednobitové hodnoty.
(Všimněte si, že druhý formát, kde má mantisa úvodní nuly, by byl v některých formátech čísel považován za denormalizovaný a jeho normalizovaná reprezentace by byla 0x400000 s exponentem -23).
Komentáře
- Mám jednu pochybnost. Provedením 8,388,607 / 2 ^ 23 dává to, co může představovat jediný bit v mantisě. Jak tedy 8 388 607/2 ^ 23 * 2 ^ 127 představuje maximální hodnotu?
- @hariprasad, na odpověď vložím postscript, protože je příliš těžké to vysvětlit ve formátu komentářů.
- kde je minimální hodnota? to ' s požadováno v názvu!
- @CharlieParker, na rozdíl od celočíselných reprezentací, kde jsou min a max posunuty, formáty s plovoucí desetinnou čárkou používají znak & reprezentace velikosti, kde velikost se skládá z exponentu a mantisy. Maximální počet ve velikosti znaménka je pak (1) kladný (znaménkový bit je 0) a (2) největší možný exponent a (3) největší možná mantisa. Minimální číslo je identické: kromě změny bitu znaménka je tedy (1) záporné (bit bitu je 1), přesto (2) největší možný exponent a (3) největší možná mantisa. Jak jsem vysvětlil výše, minimální číslo je pouze -max, takže stačí použít znak
-
.
Odpověď
Můžete si půjčit z toho, jak je IEEE plovoucí čárka vytyčena pro rychlé srovnání: znaménko, exponent, mantisa. nicméně v tom PDF vidím, že mantisa a exponent jsou obráceny.
To znamená, že pro srovnání budete muset nejprve zkontrolovat bit znaménka a pokud jeden není vítězem, porovnáte exponenty a pak porovnáte mantisa.
Pokud je jeden kladný a druhý záporný, pak kladný je max.
Pokud jsou oba kladné a jeden exponent je větší, pak je to maximum (pokud oba jsou záporné, pak je to min)
Podobně pro mantisu.
a<b?a:b
aa>b?a:b