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: