Sto cercando di calcolare lintervallo di valori minimo / massimo o dal più basso al più alto di un tipo a virgola mobile a 48 bit MIL-STD-1750A (PDF) (WIKI) .
Es: come un doppio intervallo è 1.7E +/- 308
Ho cercato equazioni e non sono sicuro che ciò che ho trovato funzionerà.
La prima equazione che ho trovato è stata
Non sono sicuro da dove cominciare con queste, se sono anche corrette in ciò di cui ho bisogno.
Qualcuno mi comunicherà le sue conoscenze e mi aiuterà a risolverlo?
Commenti
Risposta
Per la virgola mobile a 32 bit, il valore massimo è mostrato nella Tabella III:
0.9999998 x 2^127 represented in hex as: mantissa=7FFFFF, exponent=7F.
Noi può scomporre la mantissa / esponente in un valore decimale (vicino) come segue:
7FFFFF <base-16> = 8,388,607 <base-10>.
Ci sono 23 bit di significato, quindi dividiamo 8.388.607 per 2 ^ 23 .
8,388,607 / 2^23 = 0.99999988079071044921875 (see Table III)
fino allesponente:
7F <base-16> = 127 <base-10>
e ora moltiplichiamo la mantissa per 2 ^ 127 (lesponente)
8,388,607 / 2^23 * 2^127 = 8,388,607 * 2^104 = 1.7014116317805962808001687976863 * 10^38
Questo è il valore in virgola mobile a 32 bit più grande perché viene utilizzata la mantissa più grande e lesponente più grande.
La virgola mobile a 48 bit aggiunge 16 bit di mantissa di minore importanza ma lascia lesponente della stessa dimensione. Pertanto, il valore massimo sarebbe rappresentato in esadecimale come
mansissa=7FFFFFFFFF, exponent=7F.
di nuovo, possiamo calcolare
7FFFFFFFFF <base-16> = 549,755,813,887 <base-10>
lesponente massimo è ancora 127, ma dobbiamo dividere per [23 + 16 = 39, quindi:] 2 ^ 39. 127-39 = 88, quindi moltiplica per 2 ^ 88:
549,755,813,887 * 2^88 = 1.7014118346015974672186595864716 * 10^38
Questo è il valore in virgola mobile a 48 bit più grande perché abbiamo usato la mantissa più grande possibile e il massimo esponente possibile.
Quindi, i valori massimi sono:
1.7014116317805962808001687976863 * 10^38, for 32-bit, and, 1.7014118346015974672186595864716 * 10^38, for 48-bit
Il valore massimo per 48 bit è solo leggermente maggiore di per 32 bit, il che è logico dato che alcuni bit vengono aggiunti alla fine della mantissa.
(Per essere esatti il numero massimo per il formato a 48 bit può essere espresso come un numero binario che consiste di 39 1 “seguiti da 88 0”.)
(Il più piccolo è solo il negativo di questo valore. Anche il più vicino allo zero senza essere zero può essere facilmente calcolato come sopra: usa il mantissa (positiva) più piccola possibile: 0000001 e esponente più piccolo possibile: 80 in esadecimale o -128 in decimale)
FYI
Alcuni formati a virgola mobile usano un nascosto non rappresentato 1
bit nella mantissa (questo consente un ulteriore bit di precisione nella mantissa, poiché f ollows: la prima cifra binaria di tutti i numeri (eccetto 0, o denormali, vedi sotto) è un 1
, quindi non dobbiamo memorizzarlo 1
e abbiamo un po di precisione in più). Questo particolare formato non sembra farlo.
Altri formati in virgola mobile consentono la mantissa denormalizzata, che consente di rappresentare numeri (positivi) più piccoli dellesponente più piccolo, scambiando bit di precisione con poteri aggiuntivi (negativi) di 2. Questo è facile da supportare se non supporta anche quello nascosto, un po più difficile se lo fa.
8,388,607 / 2 ^ 23 è il valore che “d si ottiene con mantissa = 0x7FFFFF ed esponente = 0x00. Non è il valore del bit singolo, ma piuttosto il valore con una mantissa piena e una neutra, o più specificamente, un zero esponente.
Il motivo per cui questo valore non è direttamente 8388607 e richiede la divisione (per 2 ^ 23 e quindi è minore di quello che potresti aspettarti) è che il punto radice si trova davanti alla mantissa, piuttosto che dopo . Quindi, pensa (un segno bit, seguito da un punto radice, seguito da ventitre bit 1) per la mantissa e +/- 111111111111 (nessun punto radice qui, solo un numero intero, in questo caso, 127 ) per lesponente.
mantissa = 0x7FFFFF con esponente = 0x7F è il valore più grande che corrisponde a 8388607 * 2 ^ 104, dove 104 viene da 127-23: di nuovo, sottraendo 23 potenze di due perché la mantissa ha il punto radice allinizio. Se il punto radice fosse alla fine, il valore più grande (0x7FFFFF, 0x7F) sarebbe effettivamente 8,388.607 * 2 ^ 127.
Tra gli altri, ci sono possibili modi in cui possiamo considerare un singolo valore di bit per il mantissa. Uno è mantissa = 0x400000 e laltro è mantissa = 0x000001. senza considerare il punto radice o lesponente, il primo è 4.194.304 e il secondo è 1. Con esponente zero e considerando il punto radice, il primo è 0,5 (decimale) e il secondo è 0,00000011920928955078125. Con un esponente massimo (o minimo), possiamo calcolare i valori di bit singolo massimo e minimo.
(Si noti che il secondo formato in cui la mantissa ha zeri iniziali sarebbe considerato denormalizzato in alcuni formati numerici e la sua rappresentazione normalizzata sarebbe 0x400000 con un esponente di -23).
Commenti
- Ho un dubbio. Facendo 8,388,607 / 2 ^ 23 si ottiene ciò che un singolo bit nella mantissa può rappresentare. Quindi, in che modo 8.388.607 / 2 ^ 23 * 2 ^ 127 rappresenta il valore massimo?
- @hariprasad, inserirò un poscritto nella risposta, poiché è troppo difficile da spiegare nel formato del commento.
- dovè il valore minimo? ' è richiesto nel titolo!
- @CharlieParker, a differenza delle rappresentazioni di interi in cui min e max sono offset, i formati a virgola mobile usano il segno & rappresentazioni di grandezza, dove la grandezza è composta da un esponente e una mantissa. Il numero massimo nella grandezza del segno è quindi (1) positivo (il bit del segno è 0) e (2) il massimo esponente possibile e (3) la mantissa più grande possibile. Il numero minimo è identico: tranne che il bit di segno cambia, quindi è (1) negativo (il bit di segno è 1), ma (2) il massimo esponente possibile e (3) la mantissa più grande possibile. Come ho spiegato sopra, il numero minimo è solo -max, quindi basta inserire un
-
segno.
Risposta
Puoi prendere in prestito da come è disposto il punto mobile IEEE per un confronto veloce: segno, esponente, mantissa. comunque in quel PDF vedo mantissa ed esponente invertiti.
Ciò significa che per confrontare dovrai prima controllare il bit del segno e se uno non è il vincitore ancora confrontare gli esponenti e poi confrontare la mantissa.
Se uno è positivo e laltro è negativo, il positivo è il massimo.
Se entrambi sono positivi e un esponente è maggiore, allora è il massimo (se entrambi sono negativi, quindi è il minimo)
Allo stesso modo per mantissa.
a<b?a:b
ea>b?a:b