Tipi di dato base in MATLAB
Nella precedenti lezioni ho mostrato come usare le variabili in MATLAB: come è possibile crearle, manipolarle e cancellarle.
In questa lezione parlerò di un concetto molto importante ad esse associato: il tipo.
Tipi
Una variabile in MATLAB, così come in tutti i linguaggi di programmazione, ha associato un Tipo. Senza entrare troppo nel dettaglio del formalismo matematico che si cela dietro questo concetto, si può dire che: un tipo è un attributo di un dato (nel nostro caso di una variabile) che definisce quali operazioni sono consentite su di esso.
Nelle precedenti lezioni, abbiamo visto che, di base, MATLAB può essere utilizzato semplicemente come una calcolatrice molto avanzata. Dietro le quinte, quindi, MATLAB lavora con i numeri. Abbiamo visto come inserire espressioni matematiche ed ottenerne il risultato e, soprattutto, come salvare i risultati in variabili.
Implicitamente, nell'utilizzare le variabili, abbiamo usato varie operazioni matematiche su di esse tra cui somma, sottrazione e così via. Di base, le variabili che abbiamo creato, sono di tipo numerico. Questo perché MATLAB nasce come ambiente per il calcolo tecnico e scientifico. Essendo di tipo numerico, tutte le operazioni matematiche classiche sono consentite su tali variabili.
Se non specifichiamo diversamente, una nuova variabile creata in MATLAB è di tipo double
che sta per doppia precisione. In sostanza si tratta di un numero in virgola mobile (floating point) che approssima il comportamento di un numero reale.
Il dettaglio del funzionamento dei numeri in virgola mobile è abbastanza complesso e lo studieremo nelle lezioni di calcolo numerico. Per il momento basta sapere che, utilizzando il tipo double
, è possibile lavorare con numeri reali molto grandi ma anche molto prossimi allo zero con una precisione elevata.
MATLAB mette a disposizione due tipi per lavorare con i numeri reali: il double
e il single
. Adesso li vedremo nel dettaglio.
Valori double
in MATLAB
Provando a creare una variabile:
>> x = 23.4
x =
23.4000
possiamo chiedere a MATLAB il tipo della variabile attraverso la funzione class
:
>> class(x)
ans =
'double'
Attraverso la funzione class
MATLAB ci fornisce il tipo dell'oggetto tra parentesi. La funzione si chiama class
, ossia classe, in quanto classe è sinonimo di tipo in questo caso.
Alternativamente, possiamo anche usare il comando whos
visto nelle lezioni precedenti per vedere quali variabili sono presenti nel workspace e qual è il tipo associato:
>> whos
Name Size Bytes Class Attributes
x 1x1 8 double
Nella quarta colonna si vede il tipo associato alla variabile x
: double
. Nell'output di sopra, un dettaglio fondamentale riportato è il numero di byte utilizzati per immagazzinare la variabile x
: 8 byte. Infatti, ogni variabile di tipo double
occupa 8 byte di memoria, ossia 64 bit.
In MATLAB sono anche disponibili altre funzioni per chiedere informazioni su di un tipo. Ad esempio, se vogliamo chiedere qual è il massimo numero reale che possiamo rappresentare con una variabile di tipo double
possiamo usare la funzione realmax
:
>> realmax('double')
ans =
1.7977e+308
Il risultato è dell'ordine di realmax
richiede come argomento una sequenza di caratteri, rinchiusi tra singolo apice, che riporta il nome del tipo. Una sequenza di caratteri è a sua volta un tipo che MATLAB mette a disposizione, chiamato stringa, ma lo vedremo nel dettaglio più avanti.
Analogamente, è possibile richiedere il numero reale più piccolo rappresentabile con il tipo double
in questo modo:
>> realmin('double')
ans =
2.2251e-308
Ricapitolando:
Tipo double
Il tipo in virgola mobile double
memorizza i numeri reali usando 8 byte, ossia 64 bit.
Usando il tipo double
è possibile memorizzare numeri reali, approssimativamente, nell'intervallo:
Funzione eps
: epsilon macchina
Oltre alle funzioni realmax
e realmin
esiste un'altra funzione di importanza fondamentale: eps
. Questa funzione restituisce il cosiddetto epsilon macchina, ossia: il minor numero in valore assoluto più prossimo allo zero che è possibile rappresentare in virgola mobile. Sull'esatto significato di questa definizione rimando alle lezioni di calcolo numerico, in quanto si tratta di un concetto che merita una spiegazione a parte. Per ora, è sufficiente sapere che, approssimativamente, l'epsilon macchina ci fornisce un'informazione sul numero di cifre significative che è possibile rappresentare con quel tipo di dato. Ad esempio, richiamando eps
in questo modo:
>> eps('double')
ans =
2.2204e-16
otteniamo un risultato dell'ordine di grandezza di double
possiamo arrivare ad una precisione di circa 15 o 16 cifre significative.
Epsilon Macchina
L'Epsilon Macchina è il minor numero in valore assoluto più prossimo allo zero che è possibile rappresentare usando valori in virgola mobile.
Approssimativamente, l'epsilon macchina indica il numero massimo di cifre significative che è possibile rappresentare. Nel caso di un double
si possono memorizzare fino a 15 o 16 cifre significative.
Valore Inf
Usando i numeri in virgola mobile è possibile anche gestire situazioni particolari.
Proviamo, ad esempio, ad effettuare il seguente calcolo in MATLAB:
Si tratta di un numero gigantesco, molto più grande di realmax('double')
, ossia il più grande numero reale che siamo in grado di rappresentare in virgola mobile:
Altri ambienti di calcolo e linguaggi di programmazione in questo caso riporterebbero un errore. In gergo tecnico questo errore prende il nome di overflow. In italiano potremmo tradurlo come traboccamento. In poche parole, quando si verifica un overflow significa che il valore da rappresentare ha traboccato, ossia ha superato il limite massimo concesso e non è possibile rappresentarlo.
MATLAB si comporta in maniera differente. Infatti, provando ad eseguire il calcolo otteniamo il seguente risultato:
>> 3^1000
ans =
Inf
MATLAB restituisce un valore particolare: Inf
.
Inf
è un valore in virgola mobile che non rappresenta un numero specifico bensì un qualsiasi valore talmente grande da non poter essere rappresentato. Il suo nome viene da Infinity o Infinito anche se non è lo stesso concetto di infinito,
Quando Inf
si presenta nei nostri calcoli potrebbe significare molte cose. In primo luogo potrebbe significare che il risultato è effettivamente troppo grande per essere rappresentato. Tuttavia, l'apparizione di Inf
potrebbe nascondere situazioni più gravi, come ad esempio una divisione per zero.
Ad esempio, provando a dividere un qualunque numero per zero, otteniamo il seguente risultato:
>> 4 / 0
ans =
Inf
Matematicamente una divisione per zero non è una situazione anomala. Infatti possiamo calcolare il limite di un numero diviso per
Tuttavia, quando si ha a che fare con i calcoli numerici l'apparizione di Inf
potrebbe nascondere problemi più gravi.
Ricapitolando:
Valore Inf
In MATLAB, il valore Inf
rappresenta un qualunque numero reale talmente grande da non poter essere rappresentato.
La sua comparsa tra i risultati potrebbe indicare una divisione per zero.
Inf
e il concetto matematico di infinito,
Valore NaN
In MATLAB esiste un secondo valore speciale in virgola mobile: NaN
.
Esistono casi, infatti, in cui il risultato di un'espressione non è definito da un punto di vista matematico. Mentre altri ambienti di calcolo e linguaggi di programmazione restituiscono un errore, MATLAB restituisce, invece, il valore speciale NaN
.
Il nome stesso di NaN
sta per Not A Number, ossia Non è un numero, proprio per indicare il fatto che si tratta di un risultato indefinito.
Vediamo un esempio tipico. Supponiamo di voler dividere zero per zero:
Da un punto di vista matematico, un'operazione del genere non ha significato. Per cui MATLAB si comporterà in questo modo:
>> 0 / 0
ans =
NaN
Rispetto ad Inf
, la comparsa di NaN
tra i risultati indica una situazione più grave. Infatti, mentre nel primo caso potrebbe semplicemente trattarsi di un valore troppo grande per essere rappresentato, nel caso di NaN
significa che il risultato non è definito o non ha senso.
Valore NaN
In MATLAB, il valore NaN
rappresenta un risultato indefinito.
Il suo nome sta per Not A Number, ossia Non è un Numero.
Valori single
in MATLAB
Il double
non è l'unico tipo, messo a disposizione di MATLAB, per rappresentare numeri reali. Esiste anche il tipo single
, ossia singola precisione.
Attraverso il single
è possibile rappresentare numeri reali con una precisione inferiore, come si può intuire dal nome. Per creare una variabile di tipo single
è, tuttavia, necessario specificare il tipo direttamente attraverso la funzione single
:
>> x = single(23.4)
x =
single
23.4000
Attraverso single
si può convertire un qualunque numero in un valore a singola precisione. Possiamo ottenere maggiori dettagli utilizzando whos
:
>> whos
Name Size Bytes Class Attributes
x 1x1 4 single
La cosa fondamentale da notare è in terza colonna: il numero di byte occupati da un single
è la metà di un double
, ossia 4 byte. Per cui, sebbene i numeri single
offrono una precisione inferiore, la memoria occupata si dimezza. A prima vista questo può sembrare un vantaggio di poco conto. Tuttavia, quando si realizzano programmi complessi che processano grandi quantità di dati, spesso la differenza di memoria occupata tra double
e single
può fare la differenza, specialmente se non è richiesta una precisione spinta. Inoltre, le operazioni effettuate sui numeri in singola precisione impiegano tempi inferiori per essere eseguite rispetto al tipo double
e questo può ridurre notevolmente i tempi di calcolo.
Di seguito riporto l'output di MATLAB alle funzioni realmin
, realmax
e eps
richiamate su 'single'
:
>> realmin('single')
ans =
single
1.1755e-38
>> realmax('single')
ans =
single
3.4028e+38
>> eps('single')
ans =
single
1.1921e-07
Notate l'ultimo risultato di eps
. Da questo numero, dell'ordine di single
possiamo ottenere una precisione di circa 6 o 7 cifre significative.
Riassumendo: con il tipo single
si perde in precisione ma si guadagna sia in memoria occupata (la metà), sia in tempo di calcolo. Fin quando realizziamo programmi semplici o effettuiamo calcoli non troppo complessi, possiamo tralasciare questo dettaglio e usare il tipo double
fornito di default.
Tipo single
Il tipo in virgola mobile single
memorizza i numeri reali usando 4 byte, ossia 32 bit. Rispetto al double
, il single
offre meno precisione ma occupa metà della memoria e i calcoli sono più veloci.
Con un single
si possono ottenere fino a 6 o 7 cifre significative.
Riassumendo
Questa lezione ha introdotto il concetto di tipo e quale sia il tipo di default utilizzato da MATLAB: il double
.
Abbiamo visto come un double
occupi 8 byte e quali siano i range di numeri rappresentabili. In particolare abbiamo visto le tre funzioni:
realmin
che indica il minimo numero rappresentabile;realmax
che indica il massimo numero rappresentabile;eps
che restituisce l'epsilon macchina, cioè un indicatore della precisione raggiungibile in termini di numero di cifre significative.
Inoltre, in questa lezione abbiamo visto che esistono due valori speciali:
Inf
che indica un valore talmente grande da non poter essere rappresentato;NaN
, ossia Not A Number che indica un risultato indefinito.
Abbiamo studiato anche il tipo single
che occupa metà della memoria, 4 byte, e su cui i calcoli sono più veloci.
Nella prossima lezione, prima di mostrare altri tipi supportati da MATLAB, vedremo alcune funzioni matematiche base che è possibile richiamare sui numeri reali per effettuare i nostri calcoli.