[zxspectrum] Migliorata e ottimizzata la routine NRD

  • From: Enrico Maria Giordano <e.m.giordano@xxxxxxxxxxxxxxx>
  • To: The ZX Spectrum Mailing-List <zxspectrum@xxxxxxxxxxxxx>
  • Date: Fri, 14 Aug 2015 17:41:13 +0200

Questa è più complicata. :-)

Ho aggiornato la documentazione sul mio sito. La riporto qui:

NRD - Normalize float down

IX = Data HL = 10^(dec-B) C = Data len B = Dec

Normalizza il dato puntato da IX riducendo i decimali al valore
contenuto in B e dividendo la mantissa per l'opportuna potenza di
dieci. Ad esempio, 12345678 5 (123.45678) con B = 3 diventerebbe
123456 3 (123.456). La lunghezza della mantissa del dato è contenuta
in C. HL deve puntare ad un dato contenente il valore 10^(dec-B),
dove dec è il numero di decimali attuali. Nell'esempio 10^(5-3) = 100.

Ora dovrebbe essere più chiara. :-)

Eppure guardate la routine quanto è semplice:

LD (IX+0),B
INC IX
CALL DIV
RET

Non ha confronto con, ad esempio, la moltiplicazione. E tutti sanno cos'è una moltiplicazione. Tanto per dire che a volte è più difficile spiegare una cosa più semplice. :-)

A cosa serve in pratica? Se faccio una moltiplicazione tra numeri floating point:

1.234 * 5.678 = 7,006652

come potete vedere, il numero di cifre decimali è raddoppiato (da 3 per ogni operando è andato a 6 per il risultato). Se continuassi nelle moltiplicazioni alla fine avrei una sfilza infinita di decimali per cui il sistema andrebbe molto presto in overflow.

La routine NRD serve proprio a limitare il numero di cifre decimali. Quindi, se decidessi che il risultato deve avere 3 cifre decimali come gli operandi otterrei

1.234 * 5.678 = 7,006

e a questo punto ulteriori moltiplicazioni manterrebbero le cifre decimali sempre costanti a 3.

EMG

--
EMAG Software Homepage: http://www.emagsoftware.it
The EMG Music page: http://www.emagsoftware.it/emgmusic
The EMG's ZX-Spectrum Page: http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: http://www.emagsoftware.it/tbosg

Other related posts: