12.06.2013 Views

1 - Amiga Magazine Online

1 - Amiga Magazine Online

1 - Amiga Magazine Online

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

di un ricercatore di fisica nucleare, per cui possiamo tran-<br />

quillamente sottostare a qualche compromesso. Risulta<br />

comunque evidente quanto sia importante scegliere con<br />

attenzione il numero di bit da dedicare alla parte frazio-<br />

naria e a quella intera.<br />

Per specificare il formato di un numero in virgola fissa,<br />

spesso si utilizza la notazione x.y, dove x è il numero di<br />

bit dedicati alla parte intera e y il numero di bit per la<br />

parte frazionaria. Quindi, per esempio, scrivendo 1124.8",<br />

si vuole indicare che il numero è composto da 24 bit per<br />

la parte intera e da 8 bit per la parte frazionaria. Per ovvi<br />

motivi è conveniente che la somma del numero di bit de-<br />

dicati alle due parti sia pari al numero di bit della più<br />

lunga parola che il processore è in grado di trattare e<br />

che, per i processori Motorola della serie 680x0, è 32.<br />

Nella pratica si nota come il formato 16.16 sia il più adat-<br />

to alla maggioranza delle applicazioni. Esso permette una<br />

buona precisione nella parte frazionaria W65 536=<br />

0.000015258) e la rappresentazione di numeri sufficiente-<br />

mente grandi. Inoltre, come vedremo tra breve, la con-<br />

versione in un numero intero è estremamente semplice e<br />

veloce. D'ora in poi, se non diversamente specificato, si<br />

farà sempre riferimento al formato 16.16 dei numeri in<br />

virgola fissa. Si veda in figura 2 il modo in cui la rappre-<br />

sentazione in virgola fissa, formato 16.16, viene rappre-<br />

sentata in una long.<br />

Fig. 2. Rappresentazione in virgola fissa<br />

nel formato 16.16.<br />

A questo punto abbiamo bisogno di un insieme di rego-<br />

le, seguendo le quali sarà possibile convertire in altro for-<br />

mato i numeri in virgola fissa, sommarli tra di loro, molti-<br />

plicarli, e così via.<br />

iniziamo con la conversione che i più attenti di voi sono<br />

già in grado di effettuare utilizzando la relazione poco<br />

prima descritta. Per esempio, il numero 12.3456, converti-<br />

to nel formato 16.16, è pari a:<br />

Se I'assemblatore utilizzato non supporta i calcoli floating<br />

point per le costanti, bisognerà effettuare a mano la mol-<br />

tiplicazione, per cui l'assegnazione a un registro dati sarà<br />

semplicemente:<br />

Nella conversione inversa si avrà:<br />

Come si può notare, c'è una perdita di precisione che è<br />

tanto più contenuta quanto più alto è il numero di bit de-<br />

dicati alla parte frazionaria.<br />

È da notare che il formato 16.16 permette di prelevare la<br />

parte intera di un numero con due semplici istruzioni as-<br />

sembly; se il valore è in do, basta infatti:<br />

c1r.w do<br />

swap do<br />

Passiamo alle operazioni sui numeri in virgola fissa. La<br />

somma di due numeri si effettua senza nessun particolare<br />

accorgimento rispetto ai numeri interi. L'istruzione:<br />

è tutto quello che serve per sommare due numeri in vir-<br />

gola fissa contenuti in do e dl, mentre per la sottrazione<br />

è sufficiente:<br />

Eventuali overflow dovranno essere gestiti come per i<br />

numeri interi.<br />

È interessante notare come, in alcune applicazioni, risulti<br />

utile memorizzare la parte intera e quella frazionaria in<br />

due diversi registri. In questo caso le due parti possono<br />

avere un'estensione di 32 bit e la somma viene eseguita<br />

come segue:<br />

dove do e d2 sono le parti frazionarie dei due addendi,<br />

mentre dl e d3 sono le parti intere.<br />

I1 discorso è un po' più complesso per quel che riguarda<br />

le divisioni e le moltiplicazioni. Abbiamo detto che i nu-<br />

meri in virgola fissa sono internamente moltiplicati per<br />

65536 (nel formato 16.16), per cui il prodotto di due nu-<br />

meri, la cui parte intera sia maggiore o uguale a 1.0, pro-<br />

durrebbe un overflow, o un risultato a 64 bit (nel forma-<br />

to 32.32). Per chiarire meglio le idee, mi si conceda I'ap-<br />

prossimazione contenuta nella seguente affermazione: un<br />

numero decimale A, nella sua forma in virgola fissa è pa-<br />

ri ad A*K, dove K vale 2Abit-parte-frazionaria (6 5536 nel<br />

nostro caso). I1 prodotto dei due numeri decimali A e B<br />

nel formato in virgola fissa, vale:

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!