Come calcolare i valori min / max dei numeri in virgola mobile?

4

Sto provando a calcolare il minimo / massimo, o il più basso al più alto intervallo di valori di un tipo a virgola mobile a 48 bit MIL-STD-1750A (PDF) (WIKI) .

Es: come un doppio intervallo è 1.7E +/- 308

Ho cercato le equazioni e non sono sicuro che ciò che ho trovato funzionerà.

La prima equazione che ho trovato era

Ilsecondoera

Non sono abbastanza sicuro da dove cominciare, se sono corretti anche in quello di cui ho bisogno.

Qualcuno mi comunicherà le sue conoscenze e aiuterà a risolverlo?

    
posta CodeMonkey 21.08.2015 - 17:45
fonte

2 risposte

6

Per il floating point a 32 bit, il valore massimo è mostrato nella Tabella III:

0.9999998 x 2^127 represented in hex as: mansissa=7FFFFF, exponent=7F.

Possiamo decomporre la mantissa / esponente in un valore decimale (chiuso) come segue:

7FFFFF <base-16> = 8,388,607 <base-10>. 

Ci sono 23 bit di significato, quindi dividiamo 8.388.607 di 2 ^ 23.

8,388,607 / 2^23 = 0.99999988079071044921875 (see Table III)

per quanto riguarda l'esponente:

7F <base-16> = 127 <base-10>

e ora moltiplichiamo la mantissa di 2 ^ 127 (l'esponente)

8,388,607 / 2^23 * 2^127 = 
8,388,607 * 2^104 = 1.7014116317805962808001687976863 * 10^38

Questo è il più grande valore a virgola mobile a 32 bit, poiché viene utilizzata la mantissa più grande e l'esponente più grande.

Il punto mobile a 48 bit aggiunge 16 bit di mantissa di rilevanza minore, ma lascia l'esponente della stessa dimensione. Quindi, 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> 

l'esponente massimo è ancora 127, ma dobbiamo dividere per [23 + 16 = 39, quindi:] 2 ^ 39. 127-39 = 88, quindi basta moltiplicare per 2 ^ 88:

549,755,813,887 * 2^88 =
1.7014118346015974672186595864716 * 10^38

Questo è il più grande valore in virgola mobile a 48 bit perché abbiamo usato la mantissa più grande possibile e il più grande 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 è leggermente più grande di 32-bit, il che equivale a perché alcuni bit vengono aggiunti alla fine della mantissa.

(Per essere precisi 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. Il più vicino allo zero senza zero può anche essere facilmente calcolato come sopra: usa la mantissa più piccola possibile (positiva): 0000001 e l'esponente più piccolo possibile: 80 in hex, o -128 in decimale)

FYI

Alcuni formati in virgola mobile utilizzano un mantello nascosto% non1 nella mantissa (ciò consente un ulteriore bit di precisione nella mantissa, come segue: la prima cifra binaria di tutti i numeri (eccetto 0, o denormali, vedi sotto ) è un 1 , quindi non dobbiamo memorizzare quel 1 , e abbiamo un ulteriore bit di precison). Questo particolare formato non sembra farlo.

Altri formati in virgola mobile consentono la mantissa denormalizzata, che consente di rappresentare numeri (positivi) più piccoli del più piccolo esponente, scambiando bit di precisione per poteri aggiuntivi (negativi) di 2. Questo è facile da supportare se non supporta anche il nascosto un po ', un po' più difficile se lo fa.

8.388.607 / 2 ^ 23 è il valore che otterresti con mantissa = 0x7FFFFF ed esponente = 0x00. Non è il valore a singolo bit, ma piuttosto il valore con una mantissa completa e neutrale, o più specificamente, un zero .

Il motivo per cui questo valore non è direttamente 8388607 e richiede una divisione (per 2 ^ 23 e quindi è inferiore a quello che ci si potrebbe aspettare) è perché l'implicito punto di radix si trova in fronte della mantissa, piuttosto che dopo . Quindi, pensa +/-.111111111111111111111 (un bit di segno, seguito da un punto di radix, seguito da ventitré 1 bit) per la mantissa e +/- 111111111111 (nessun punto di radix qui, solo un numero intero, in questo caso, 127) per l'esponente.

mantissa = 0x7FFFFF con esponente = 0x7F è il valore più grande che corrisponde a 8388607 * 2 ^ 104, dove 104 viene da 127-23: ancora, sottraendo 23 poteri di due perché la mantissa ha il punto di radix all'inizio. Se il punto di radix era alla fine, allora il valore più grande (0x7FFFFF, 0x7F) sarebbe in effetti 8,388,607 * 2 ^ 127.

Tra l'altro, ci sono modi possibili per considerare un valore a un bit per la mantissa. Uno è mantissa = 0x400000 e l'altro è mantissa = 0x000001. senza considerare il punto di radix o l'esponente, il primo è 4.194.304 e il secondo è 1. Con un esponente zero e considerando il punto radix, il primo è 0.5 (decimale) e il secondo è 0.00000011920928955078125. Con un esponente massimo (o minimo) possiamo calcolare i valori massimi e minimi dei bit singoli.

(Si noti che il secondo formato in cui la mantissa ha zeri iniziali verrebbe considerato denormalizzato in alcuni formati numerici e la sua rappresentazione normalizzata sarebbe 0x400000 con un esponente di -23).

    
risposta data 21.08.2015 - 19:05
fonte
0

È possibile prendere in prestito da come il virgola mobile IEEE è disposto per un confronto veloce: segno, esponente, mantissa. comunque in quel PDF vedo mantissa ed esponente sono invertiti.

Questo significa che per confrontare dovrai prima controllare il bit del segno e se uno non è ancora il vincitore, paragonerai gli esponenti e poi confronterai la mantissa.

Se uno è positivo e l'altro è negativo, il positivo è il massimo

Se entrambi sono positivi e un esponente è più grande, allora è il massimo (se entrambi sono negativi, allora è il minimo)

Allo stesso modo per la mantissa.

    
risposta data 21.08.2015 - 18:03
fonte

Leggi altre domande sui tag