Guida a PHP: tipi numerici reali

Dopo una lunga pausa riprendiamo la guida a PHP occupandoci in questo post della rappresentazione e della gestione dei numeri numeri reali: uno dei problemi cruciali riguarda la rappresentazione di un insieme infinito di valori in una macchina la cui memoria è invece finita e limitata.

Introduzione

Un nodo cruciale nella comprensione della rappresentazione dei numeri deciali all’interno di un calcolatore risiede nella distinzione tra l’insieme dei reali ℜ e l’insieme dei numeri in virgola mobile: quest’ultimo è in effetti un sottoinsieme discreto di ℜ. Ciò implica che non tutti i numeri reali hanno un corrispondente valore nell’insieme dei numeri a virgola mobile e – oltre una certa soglia di precisione – il valore reale viene arrotondato a quello in virgola mobile più prossimo: ciò significa che ogni numero in virgola mobile rappresenta un (pur piccolo) sottoinsieme di numeri reali. Pensando alla retta dei numeri reali, possiamo immaginare l’insieme dei numeri in virgola mobile come un sottoinsieme discreto di punti a distanza variabile: se si sceglie un numero reale qualsiasi su tale retta esso verrà approssimato nella memoria del calcolatore al numero in virgola mobile più “vicino”.
Questo fenomeno introduce un errore di arrotondamento, che tende a propagarsi sul risultato e che ha effetti pericolosi sulle operazioni, che potrebbero così restituire risultati inattesi.

Rappresentazione macchina

La rappresentazione di un numero in virgola mobile è caratterizzata da:

  • segno: positivo o negativo;
  • mantissa: sequenza di cifre c1c2...cn (da trattare come il seguente numero: c1.c2c3...cn ove ‘.’ è il separatore decimale);
  • esponente: potenza della base (di numerazione) cui dev’essere moltiplicata la mantissa per ottenere il numero effettivo.

Precisione della rappresentazione

Da sottolineare dunque che la precisione dipende dalla mantissa (il numero di cifre a disposizione per rappresentare il valore), mentre i valori massimo e minimo dipendono dall’esponente: maggiore è la memoria a disposizione, maggiori saranno sia la precisione della rappresentazione sia i valori massimo e minimo rappresentabili, ma in ogni caso, dato un generico numero reale, la memoria del calcolatore sarà in grado di memorizzare solo le n cifre più significative (ove n è la dimensione della mantissa), mentre le restanti verranno arrotondate a 0.
Ciò si traduce in una conseguenza spesso trascurata: la precisione della rappresentazione dei numeri in virgola mobile non è assoluta (cioè pari ad un valore costante, ad esempio 0.001) ma dipende dall’ordine di grandezza della cifra più significativa; in pratica, più grande è il numero reale da rappresentare, maggiore sarà l’errore (assoluto) di arrotondamento commesso ma sempre di n ordini di grandezza inferiore rispetto alla cifra più significativa (errore relativo). Per chiarire il concetto vediamo un esempio:

// dimensione mantissa = 5
x = 2.71828;
// mantissa = 27182 --> errore assoluto < 0.0001 
y = 271.828;
// mantissa = 27182 --> errore assoluto < 0.01

PHP e i numeri reali

Fatta questa necessaria premessa, i numeri in virgola mobile possono essere espressi con la notazione classica o scientifica; in entrambi i casi si utilizza il carattere punto ‘.’ come separatore tra parte intera e parte decimale:

  • notazione classica: 213.5
  • notazione scientifica: 2.135e2

In base ai problemi di rappresentazione evidenziati in precedenza, un’operazione di confronto tra due numeri reali diversi può avere un esito imprevisto: se i numeri reali sono diversi ma la loro differenza è inferiore alla precisione i valori corrispondenti in virgola mobile saranno infatti considerati uguali.

Annunci

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...