Esercizio 28virgola mobile, conversioni e formati ridotti
In questa pagina 9
Testo (esempi di compito e di compitino di Architettura degli Elaboratori, UniPD, a.a. 2010-11, 2011-12, 2014-15 e 2015-16: quesito 2 a risposta multipla e due esercizi sulla virgola mobile). Teoria: Numeri in virgola mobile IEEE 754Virgola fissa e virgola mobile; formato IEEE 754 a 32 e 64 bit (segno, esponente in eccesso 127, mantissa con 1 implicito); conversioni svolte nei due versi; valori speciali, denormalizzati, intervallo, precisione e arrotondamento.Numeri in virgola mobile IEEE 754 →.
- Convertire il numero in formato a virgola mobile IEEE 754 a precisione singola.
- Che numero rappresenta la configurazione
0100 0110 0100 0110 0000 0000 0000 0000in formato IEEE 754 a precisione singola? - Si consideri la rappresentazione in virgola mobile a precisione singola (IEEE 754)
1100 0000 1110 1010 0000 0000 0000 0000. Il numero rappresentato è: a) ; b) ; c) ; d) ; e) nessuna delle precedenti. - Stessa domanda per
0011 1110 0011 1000 0000 0000 0000 0000: a) ; b) ; c) ; d) ; e) nessuna. - Si consideri la rappresentazione in virgola mobile che usa 3 bit per l'esponente e 4 bit per la mantissa (più il bit di segno). Il numero viene rappresentato dalla sequenza: a)
11011101; b)10101101; c)11101101; d)11101010; e) nessuna. - Con 4 bit per l'esponente e 11 bit per la mantissa il numero è rappresentato da: a)
1110001001001000; b)1010101001001000; c)1010010010001100; d)1010010010000101; e) nessuna.
Formato
Un numero normalizzato è con ( bit di esponente) e bit nascosto davanti alla frazione. Singola precisione: 1 bit di segno, 8 di esponente (bias ), 23 di frazione. Nei formati ridotti dei quesiti 5 e 6 si usa la stessa regola con (bias ) e (bias ); è l'unica interpretazione che porta a una delle opzioni elencate.
Codificare :
- segno: se ;
- scrivere in binario e normalizzare: ;
- esponente memorizzato , in binario su bit;
- frazione: i bit dopo la virgola, riempiti con zeri a destra o troncati a bit.
Decodificare: l'inverso. Vedi gli esempi in Numeri in virgola mobile IEEE 754Virgola fissa e virgola mobile; formato IEEE 754 a 32 e 64 bit (segno, esponente in eccesso 127, mantissa con 1 implicito); conversioni svolte nei due versi; valori speciali, denormalizzati, intervallo, precisione e arrotondamento.Numeri in virgola mobile IEEE 754 →.
1. in singola precisione
- Segno .
- ; (). Quindi .
- Normalizzando: .
- Esponente memorizzato: .
- Frazione:
1110011seguita da zeri (23 bit totali):11100110000000000000000.
2. 0 10001100 10001100000000000000000
- Segno : positivo.
- Esponente ; .
- Frazione
1000110...: ; con il bit nascosto .
3. 1 10000001 11010100000000000000000
- Segno : negativo; esponente → .
- Frazione
1101010...: ; con il bit nascosto .
→ risposta a. ( è la mantissa senza l'esponente: errore di chi dimentica .)
4. 0 01111100 01110000000000000000000
- Segno ; esponente → .
- Frazione
0111: ; con il bit nascosto .
→ risposta c.
5. Formato 1 + 3 + 4 bit:
- Segno . .
- Esponente memorizzato: .
- Frazione: 4 bit:
1101(i bit successivi,00110011..., si troncano).
Il numero realmente rappresentato è : la rappresentazione di è approssimata (errore ): con 4 bit di frazione i numeri vicini a 7 distano .
6. Formato 1 + 4 + 11 bit:
- Segno . , : .
- Esponente memorizzato: bias : .
- Frazione, 11 bit:
01001001completata con tre zeri:01001001000.
Questo numero è esatto: ha solo 8 bit dopo la virgola nella forma normalizzata, che stanno negli 11 bit di frazione.
Verifica con un programma
import struct
from fractions import Fraction
def codifica(x, bit_esp, bit_man):
"""x -> bit (segno, esponente con bias 2^(k-1)-1, 1.f troncata a bit_man bit); solo numeri normalizzati."""
bias = 2 ** (bit_esp - 1) - 1
s = "1" if x < 0 else "0"
x = abs(Fraction(x))
e = 0
while x >= 2:
x /= 2; e += 1
while x < 1:
x *= 2; e -= 1
man = int((x - 1) * 2 ** bit_man) # troncamento
return s + format(e + bias, f"0{bit_esp}b") + format(man, f"0{bit_man}b")
def decodifica(bits, bit_esp, bit_man):
bias = 2 ** (bit_esp - 1) - 1
segno = -1 if bits[0] == "1" else 1
E = int(bits[1:1 + bit_esp], 2)
m = int(bits[1 + bit_esp:], 2)
return segno * (1 + Fraction(m, 2 ** bit_man)) * Fraction(2) ** (E - bias)
print(codifica(Fraction(-30375, 1000), 8, 23)) # 11000001111100110000000000000000
print(hex(struct.unpack(">I", struct.pack(">f", -30.375))[0])) # 0xc1f30000: il controllo con il float vero
print(float(decodifica("01000110010001100000000000000000", 8, 23))) # 12672.0
print(float(decodifica("11000000111010100000000000000000", 8, 23))) # -7.3125
print(float(decodifica("00111110001110000000000000000000", 8, 23))) # 0.1796875
b5 = codifica(Fraction(-73, 10), 3, 4)
print(b5, float(decodifica(b5, 3, 4))) # 11011101 -7.25
print(codifica(Fraction(-41125, 1000), 4, 11)) # 1110001001001000Errori comuni
- Dimenticare il bit nascosto (usare invece di ).
- Non sottrarre il bias (o sottrarre 128, 255): per 8 bit il bias è .
- Dimenticare di moltiplicare per e dare come risposta la mantissa ().
- Normalizzare male: (si sposta la virgola di 4 posti).
- Usare il bias di 127 anche nei formati ridotti: con bit il bias è .
- Credere che sia memorizzato esattamente: con pochi bit si rappresenta solo un numero vicino.
Versione ripasso
Esempi di compito e compitino (UniPD, a.a. 2010-11, 2011-12, 2014-15, 2015-16): virgola mobile IEEE 754. Teoria: Numeri in virgola mobile IEEE 754Virgola fissa e virgola mobile; formato IEEE 754 a 32 e 64 bit (segno, esponente in eccesso 127, mantissa con 1 implicito); conversioni svolte nei due versi; valori speciali, denormalizzati, intervallo, precisione e arrotondamento.Numeri in virgola mobile IEEE 754 →.
Formato: , bias ( per 8 bit, per 3 bit, per 4 bit); bit nascosto .
Codificare: segno; in binario normalizzato ; ; frazione troncata a bit.
- →
1 10000011 11100110000000000000000(). 0 10001100 1000110...→ , .1 10000001 1101010...→ (risposta a).0 01111100 0111...→ (risposta c).- Formato 1+3+4: , →
11011101(valore effettivo ). - Formato 1+4+11: , →
1110001001001000(esatto).
Errori comuni: bit nascosto dimenticato; bias non sottratto; dimenticato; normalizzazione sbagliata; bias 127 nei formati ridotti.