Ik “m probeer de min / max, of het laagste naar hoogste waardebereik te berekenen van een 48 bit drijvende-komma type MIL-STD-1750A (PDF) (WIKI) .
Voorbeeld: hoe een dubbel bereik is 1.7E +/- 308
Ik heb rondgekeken naar vergelijkingen en weet niet zeker of wat ik heb gevonden zal werken.
De eerste vergelijking die ik vond was
Ik “weet niet precies waar ik ermee moet beginnen, of ze zelfs correct zijn in wat ik nodig heb.
Zal iemand mij zijn kennis overbrengen en dit helpen oplossen?
Opmerkingen
Antwoord
Voor 32-bits drijvende komma wordt de maximale waarde weergegeven in Tabel III:
0.9999998 x 2^127 represented in hex as: mantissa=7FFFFF, exponent=7F.
We kan de mantisse / exponent als volgt ontleden in een (nauwe) decimale waarde:
7FFFFF <base-16> = 8,388,607 <base-10>.
Er zijn 23 bits significantie, dus we delen 8.388.607 door 2 ^ 23 .
8,388,607 / 2^23 = 0.99999988079071044921875 (see Table III)
zover als de exponent:
7F <base-16> = 127 <base-10>
en nu vermenigvuldigen we de mantisse met 2 ^ 127 (de exponent)
8,388,607 / 2^23 * 2^127 = 8,388,607 * 2^104 = 1.7014116317805962808001687976863 * 10^38
Dit is de grootste 32-bits drijvende-kommawaarde omdat de grootste mantisse wordt gebruikt en de grootste exponent.
De 48-bit drijvende komma voegt 16 bits van lessor significantie mantisse toe, maar laat de exponent even groot. De maximale waarde wordt dus in hexadecimaal weergegeven als
mansissa=7FFFFFFFFF, exponent=7F.
nogmaals, we kunnen berekenen
7FFFFFFFFF <base-16> = 549,755,813,887 <base-10>
de maximale exponent is nog steeds 127, maar we moeten delen door [23 + 16 = 39, dus:] 2 ^ 39. 127-39 = 88, dus vermenigvuldig gewoon met 2 ^ 88:
549,755,813,887 * 2^88 = 1.7014118346015974672186595864716 * 10^38
Dit is de grootste 48-bits drijvende-kommawaarde omdat we de grootst mogelijke mantisse hebben gebruikt en grootst mogelijke exponent.
Dus de maximale waarden zijn:
1.7014116317805962808001687976863 * 10^38, for 32-bit, and, 1.7014118346015974672186595864716 * 10^38, for 48-bit
De maximale waarde voor 48-bit is net iets groter dan voor 32-bits, wat logisch is aangezien een paar bits aan het einde van de mantisse worden toegevoegd.
(Om precies te zijn kan het maximale aantal voor het 48-bits formaat worden uitgedrukt als een binair getal dat bestaat uit 39 1-inch gevolgd door 88 0-inch.)
(De kleinste is gewoon het negatieve van deze waarde. De kleinste waarde bij nul zonder nul te zijn, kan ook gemakkelijk worden berekend zoals hierboven: gebruik de kleinst mogelijke (positieve) mantisse: 0000001 en de kleinst mogelijke exponent: 80 in hexadecimaal, of -128 in decimaal)
Ter info
Sommige drijvende-komma-formaten gebruiken een niet-vertegenwoordigde verborgen 1
bit in de mantisse (dit zorgt voor een extra beetje precisie in de mantisse, aangezien f ollows: het eerste binaire cijfer van alle getallen (behalve 0, of denormalen, zie hieronder) is een 1
, daarom hoeven we dat , en we hebben een extra beetje precisie). Dit specifieke formaat lijkt dit niet te doen.
Andere drijvende-komma-formaten staan gedenormaliseerde mantisse toe, waarmee (positieve) getallen kleiner dan de kleinste exponent kunnen worden weergegeven door stukjes precisie in te ruilen voor extra (negatieve) machten van 2. Dit is gemakkelijk te ondersteunen als het niet ook het verborgen bit ondersteunt, een beetje moeilijker als het dat wel doet.
8,388,607 / 2 ^ 23 is de waarde die je zou krijgen met mantisse = 0x7FFFFF en exponent = 0x00. Het is niet de enkele bitwaarde, maar eerder de waarde met een volledige mantisse en een neutrale, of meer specifiek, een nul exponent.
De reden dat deze waarde niet direct 8388607 is, en delen vereist (door 2 ^ 23 en dus minder dan je zou verwachten) is dat het impliciete radixpunt staat vooraan van de mantisse, in plaats van erachter . Denk dus aan (een tekenbit, gevolgd door een radixpunt, gevolgd door drieëntwintig 1-bits) voor de mantisse en +/- 111111111111 (geen radixpunt hier, alleen een geheel getal, in dit geval 127 ) voor de exponent.
mantisse = 0x7FFFFF met exponent = 0x7F is de grootste waarde die overeenkomt met 8388607 * 2 ^ 104, waarbij de 104 afkomstig is van 127-23: nogmaals, 23 machten van twee aftrekken omdat de mantisse het radixpunt heeft in het begin. Als het radixpunt aan het einde was, dan zou de grootste waarde (0x7FFFFF, 0x7F) inderdaad 8.388.607 * 2 ^ 127 zijn.
Er zijn onder andere mogelijke manieren waarop we een enkele bitwaarde voor de mantisse. De ene is mantisse = 0x400000, en de andere is mantisse = 0x000001. zonder rekening te houden met het radixpunt of de exponent, is de eerste 4.194.304 en de laatste is 1. Met een exponent nul en rekening houdend met het radixpunt is de eerste 0,5 (decimaal) en de laatste 0,00000011920928955078125. Met een maximale (of minimale) exponent kunnen we max en min enkele bitwaarden berekenen.
(Merk op dat het laatste formaat waarbij de mantisse voorloopnullen heeft, in sommige getalnotaties als gedenormaliseerd zou worden beschouwd, en de genormaliseerde weergave zou 0x400000 zijn met een exponent van -23).
Opmerkingen
- Ik twijfel. Door 8,388,607 / 2 ^ 23 te doen, krijg je wat een enkel bit in de mantisse kan vertegenwoordigen. Dus hoe 8,388,607 / 2 ^ 23 * 2 ^ 127 vertegenwoordigt de maximale waarde?
- @hariprasad, ik zal een postscript op het antwoord plaatsen, omdat het te moeilijk is om uit te leggen in het commentaarformaat.
- waar is de minimumwaarde? it ' wordt gevraagd in de titel!
- @CharlieParker, in tegenstelling tot integer-representaties waar min en max offset zijn, gebruiken drijvende-komma-formaten teken & magnitude-representaties, waarbij de magnitude is samengesteld uit een exponent en een mantisse. Het maximale aantal in tekengrootte is dan (1) positief (tekenbit is 0) en (2) de grootst mogelijke exponent en (3) grootst mogelijke mantisse. Het min-getal is identiek: behalve dat het tekenbit verandert, dus het is (1) negatief (tekenbit is 1), maar toch (2) de grootst mogelijke exponent en (3) de grootst mogelijke mantisse. Zoals ik hierboven heb uitgelegd, is het min-getal slechts -max, dus gooi gewoon op een
-
teken.
Antwoord
Je kunt ontlenen aan hoe de IEEE drijvende komma is opgesteld voor snelle vergelijking: teken, exponent, mantisse. in die PDF zie ik echter dat mantisse en exponent omgekeerd zijn.
Dit betekent dat om je te vergelijken “je eerst het tekenbit moet controleren en als er nog geen winnaar is, vergelijk je de exponenten en dan vergelijk je de mantisse.
Als de ene positief is en de andere negatief, dan is het positieve het maximum.
Als beide positief zijn en een exponent groter is, is het maximum (als beide negatief zijn, dan is het de min)
Evenzo voor mantisse.
a<b?a:b
ena>b?a:b