Titolo: Gli arrotondamenti dei numeri reali in 4D
Categoria: Tecniche |
|
Ultimo Aggiornamento: 19/01/05 |
L’argomento dell’arrotondamento dei numeri reali è da sempre uno dei più dibattuti fra gli sviluppatori 4D. Molti considerano questo aspetto come un baco del sistema di sviluppo, altri semplicemente un problema con cui convivere serenamente avendo solo qualche accortezza. Vediamo il problema.
A scuola ci insegnano che il risultato di 1/3 è 0,3333….. con 3 periodico. Ma concettualemte sappiamo anche che tre volte un terzo fa uno. Il problema è che il computer non conosce questo problema e ritiene corretto calcolare esattamente queste espressioni. Ad esempio, a seconda del computer che usiamo, vedremo che 1/3 è calcolato con un numero ben preciso di “3” dopo la virgola: questo numero è chiamato “precisione della macchina”.
Su Mac 68K, la precisione è 19; ciò significa che 1/3 è calcolato con 19 cifre significative.
Su Win e su Power Mac, questo numero è 15; così 1/3 è visualizzato con 15 cifre significative.
Se visualizziamo l'espressione 1/3 nella finestra del Debugger di 4th Dimension, otterremo 0,3333333333333333333 su un 68K e qualcosa come 0,3333333333333333148 su Windows o su Power Macintosh. Si noti che le ultime tre cifre sono differenti perché la precisione su Windows e su Power Macintosh è minore rispetto al 68K. Tuttavia, se si visualizza l'espressione (1/3)*3, il risultato è 1 su entrambe le macchine.
Perchè il valore 1/3 sembra differente?
Nei Macintosh 68K, il sistema operativo usa 10 byte (80 bit) per memorizzare numeri reali, mentre Windows Power Macintosh 8 byte (64 bit). Ecco perchè i numeri reali hanno fino a 19 cifre significative su 68K e fino a 15 cifre significative Windows su Power Macintosh.
Allora perchè l'espressione (1/3)*3 restituisce 1 su tutte e tre le macchine?
Un computer può fare soltanto i calcoli approssimati. Di conseguenza, mentre confronta o calcola numeri, un computer non tratta i numeri reali come oggetti matematici ma come valori approssimati. Nel nostro esempio, 0,3333... moltiplicato per 3 dà 0,9999...; la differenza fra 0,9999... e 1 è così piccola che la macchina considera il risultato uguale a 1 e conseguentemente restituisce 1. Per i particolari riguardanti il "quanto piccola può essere la differenza fra 0,9999... e 1" vi rimandiamo ad una FAQ sul comando SET REAL COMPARISON LEVEL.
Bisogna dunque distinguere due cose sui numeri reali in 4D:
Come vengono calcolati e confrontati
Come vengono visualizzati sullo schermo o sulla stampante
Originariamente, 4D gestiva i numeri reali usando il tipo di memorizzazione a 10-byte. Per compatibilità, le versioni Power Macintosh e Windows di 4D continuano ancora a usare il tipo di dati a 10-byte. Poiché l'aritmetica in virgola mobile è effettuata su Windows o su Power Macintosh usando 8 byte, 4D converte i valori da 10 byte a 8 byte e viceversa. Di conseguenza, se carico un record che contiene valori reali (salvati su 68K Macintosh) su Windows o su Power Macintosh, è possibile perdere una certa precisione (19 - 15 cifre significative). Tuttavia, nel caso diametralmente opposto, su un 68K non ci sarà perdita di precisione.
Usando il Customizer Plus, si può regolare il numero di cifre da non considerare quando vengono mostrati dei numeri reali su 68K o su Power Macintosh e Windows. Le impostazioni di default sono: nessuna cifra su 68K e cinque cifre su Power Macintosh e Windows.
Inviato da: PierPaolo Sichera |
|
Visite: 12785 |
Se accedi con utente e password, puoi aggiungere dei commenti.