Jag försöker beräkna min / max, eller det lägsta till högsta värdeområdet för en 48-bitars flytpunkttyp MIL-STD-1750A (PDF) (WIKI) .
Ex: Hur ett dubbelt intervall är 1.7E +/- 308
Jag har letat efter ekvationer och är osäker på om det jag har hittat kommer att fungera.
Den första ekvationen jag hittade var
Jag är inte helt säker på var jag ska börja med dessa, om de till och med är korrekta i det jag behöver.
Kommer någon att förmedla sin kunskap till mig och hjälpa till att lösa detta?
Kommentarer
Svar
För 32-bitars flytpunkt visas det maximala värdet i tabell III:
0.9999998 x 2^127 represented in hex as: mantissa=7FFFFF, exponent=7F.
We kan sönderdela mantissa / exponent till ett (nära) decimalvärde enligt följande:
7FFFFF <base-16> = 8,388,607 <base-10>.
Det finns 23 bitar av betydelse, så vi delar 8388607 med 2 ^ 23 .
8,388,607 / 2^23 = 0.99999988079071044921875 (see Table III)
så långt som exponenten:
7F <base-16> = 127 <base-10>
och nu multiplicerar vi mantissan av 2 ^ 127 (exponenten)
8,388,607 / 2^23 * 2^127 = 8,388,607 * 2^104 = 1.7014116317805962808001687976863 * 10^38
Detta är det största 32-bitars flytpunkten eftersom den största mantissen används och den största exponenten.
Den 48-bitars flytpunkten lägger till 16 bitar av mindre betydelse mantissa men lämnar exponenten samma storlek. Således skulle det maximala värdet representeras i hex som
mansissa=7FFFFFFFFF, exponent=7F.
igen, vi kan beräkna
7FFFFFFFFF <base-16> = 549,755,813,887 <base-10>
max exponenten är fortfarande 127, men vi måste dela med [23 + 16 = 39, så:] 2 ^ 39. 127-39 = 88, så multiplicera bara med 2 ^ 88:
549,755,813,887 * 2^88 = 1.7014118346015974672186595864716 * 10^38
Det här är det största 48-bitars flytpunkten eftersom vi använde största möjliga mantissa och största möjliga exponent.
Så, maxvärdena är:
1.7014116317805962808001687976863 * 10^38, for 32-bit, and, 1.7014118346015974672186595864716 * 10^38, for 48-bit
Maxvärdet för 48-bitar är bara något större än för 32-bitars, vilket står på grund eftersom några bitar läggs till i slutet av mantissan.
(För att vara exakt kan det maximala antalet för 48-bitarsformatet uttryckas som ett binärt tal som består av 39 1 ”följt av 88 0”.)
(Det minsta är bara det negativa av detta värde. Det närmaste noll utan att vara noll kan också enkelt beräknas enligt ovan: använd minsta möjliga (positiva) mantissa: 0000001 och minsta möjliga exponent: 80 i hex, eller -128 i decimal)
FYI
Vissa flytpunktsformat använder en icke-representerad dold 1
bit i mantissa (detta möjliggör en extra bit precision i mantissa, som f ollows: den första binära siffran av alla siffror (förutom 0 eller denormala, se nedan) är en 1
, därför behöver vi inte lagra den 1
, och vi har lite extra precision). Det här formatet verkar inte göra det.
Andra flytpunktsformat tillåter denormaliserad mantissa, vilket gör det möjligt att representera (positiva) tal som är mindre än minsta exponenten genom att byta precisionsbitar för ytterligare (negativa) krafter av 2. Det här är lätt att stödja om det inte också stöder den dolda biten, lite svårare om den gör det.
8,388,607 / 2 ^ 23 är det värde du skulle få med mantissa = 0x7FFFFF och exponent = 0x00. Det är inte ett enda bitvärde utan snarare värdet med en full mantissa och en neutral, eller mer specifikt, en noll exponent.
Anledningen till att detta värde inte är direkt 8388607 och kräver delning (med 2 ^ 23 och därmed är mindre än vad du kan förvänta dig) är att den underförstådda radixpunkten ligger framför framsidan av mantissan, snarare än efter den. Så tänk (en teckenbit, följt av en radixpunkt, följt av tjugotre 1 bitar) för mantissan och +/- 111111111111 (ingen radixpunkt här, bara ett heltal, i det här fallet, 127 ) för exponenten.
mantissa = 0x7FFFFF med exponent = 0x7F är det största värdet som motsvarar 8388607 * 2 ^ 104, där 104 kommer från 127-23: igen, subtraherar 23 krafter av två eftersom mantissan har radixpunkten i början. Om radixpunkten var i slutet, skulle det största värdet (0x7FFFFF, 0x7F) verkligen vara 8388607 * 2 ^ 127.
Bland annat finns det möjliga sätt att överväga ett enda bitvärde för mantissa. En är mantissa = 0x400000, och den andra är mantissa = 0x000001. utan att beakta radixpunkten eller exponenten är den första 4,194,304 och den senare är 1. Med en nolleksponent och med tanke på radixpunkten är den förra 0,5 (decimal) och den senare är 0,00000011920928955078125. Med en maximal (eller lägsta) exponent kan vi beräkna max- och min-enstaka bitvärden.
(Observera att det senare formatet där mantissa har ledande nollor skulle betraktas som denormaliserat i vissa nummerformat, och dess normaliserade representation skulle vara 0x400000 med en exponent på -23).
Kommentarer
- Jag tvivlar. Genom att göra 8388607/2 ^ 23 ger vad en enda bit i mantissa kan representera. Så hur representerar 8,388,607 / 2 ^ 23 * 2 ^ 127 det maximala värdet?
- @hariprasad, jag lägger ett efterskrift på svaret, eftersom det är för svårt att förklara i kommentarformatet.
- var är minimivärdet? det ' begärs i titeln!
- @CharlieParker, till skillnad från heltalrepresentationer där min och max är förskjutna, använder flytande punktformat tecken & magnitudrepresentationer, där magnituden består av en exponent och en mantissa. Maxantalet i teckenstorlek är då (1) positivt (teckenbit är 0) och (2) största möjliga exponent och (3) största möjliga mantissa. Mintalet är identiskt: förutom att teckenbiten ändras, så är den (1) negativ (teckenbit är 1), ändå (2) den största möjliga exponenten och (3) den största möjliga mantissen. Som jag förklarade ovan är mintalet bara -max, så kasta bara ett
-
-tecken.
Svar
Du kan låna från hur IEEE-flytpunkten är utformad för snabb jämförelse: tecken, exponent, mantissa. men i den PDF-filen ser jag att mantissa och exponent är omvända.
Detta betyder att för att jämföra dig måste du först kontrollera teckenbiten och om en inte är vinnaren ändå jämför du exponenterna och sedan jämför du mantissan.
Om en är positiv och den andra är negativ är det positiva max.
Om båda är positiva och en exponent är större är det max (om båda är negativa är det min)
På samma sätt för mantissa.
a<b?a:b
ocha>b?a:b