Numeri reali nel calcolatore: somma

zuffff
Dato un numero reale decimale ad esempio 1,75 e convertito in binario (dovrebbe essere) 1,11, la sua rappresentazione all'interno del calcolatore supponendo i registri di 16 bit dovrebbe essere la seguente:
1° bit di segno
7 bit esponente (+64)
i rimanenti sono per la mantissa;
per questo il numero: 1,11 = 0 0100001 11100000.

Ora la questine è: se ho due numeri reali scritti in questo modo come faccio la somma???? :roll: :roll: :roll: :roll:
Grazie

Risposte
Nidhogg
Per la somma in virgola mobile c'è questo algoritmo:

1) Confronto degli esponenti dei due addendi. Scorrimento della mantissa dell'addendo minore a destra finchè il suo esponente non eguagli quello dell'addendo maggiore.

2) Somma delle mantisse dei due addendi.

3) Normalizzazione del risultato, o facendo scorrere la sua mantissa a destra e incrementando l'esponente, o facendo scorrere la mantissa a sinistra e decrementando l'esponente.

4) Esame trabboccamento. Se sì viene generata un'eccezione, altrimenti

5) Arrotondamento della mantissa al numero richiesto di bit di precisione.

6) Normalizzare ancora? Se sì fine, altrimenti passo (3).

zuffff
Grazie, ma mi fai un esempio per favore? (così capisco meglio :-D )
Ad esempio ho 10.25 e 2.75 e voglio fare la somma reale in questo modo...

Nidhogg
Ti posto un esempio con numeri diversi (già pronto!!!).

Sommare in binario i numeri reali decimali $0,5_{10}$ e $-0,4375_{10}$.

Per prima cosa, occorre trasformare i due addendi in base due, naturalmente in notazione scientifica normalizzata. Ipotizziamo una precisione di quattro bit.

$-0,5_{10}=(1/2)_{10}=(1/(2^1))_{10}=0,1_2=0,1_2x2^0=1,000_2x2^(-1)$
$-0,4375_{10}=(-7/16)_{10}=-0,0111_2=-0.0111_2x2^0=-1,110_2x2^(-2)$

Algoritmo:

Fase 1: La mantissa dell'addendo con esponente minore ($-1,110_2x2^(-2)$) va fatta scorrere verso desra, finchè l'esponente dell'addendo relativo non diventi uguale a quello dell'altro addendo:

$-1,110_2x2^(-2)=-0,111_2x2^(-1)$

Fase 2: Somma delle mantisse:

$1,000_2x2^(-1)+(-0,111_2x2^(-1))=0,001_2x2^(-1)$

Fase 3: Normalizzazione del risultato della somma delle mantisse, controllando anche l'eventuale traboccamento, verso l'alto o verso il basso, dell'esponente:

$0,001_2x2^(-1)=0,010_2x2^(-2)=0,100_2x2^(-3)=1,000_2x2^(-4)$

Dato che $127>=-4>=-126$, non si verifica traboccamento (il campo esponente, che si intepreta in rappresentazione polarizzata, vale -4+127, cioè 123, valore che cade nell'intervallo tra 0 e 255, i due valori estremi per il campo esponente).

Fase 4: Arrotondamento del risultato della somma:

$1,000_2x2^(-4)$

Il risultato è già rappresentato con precisione di quattro bit, perciò non c'è alcun bisogno di arrotondare. Il risultato convertito in decimale è:

$1,000_2x2^(-4)=0,0001000_2=0,0001_2=(1/(2^4))_{10}=(1/16)_{10}=0,0625_{10}.

Questo è proprio il risultato della somma tra $0,5_{10}$ e $-0,4375_{10}$.

Che fatica!!! :-D

zuffff
grazie mille :-D

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.