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 10^{308}, un numero gigantesco. Da notare che la funzione 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:

Definizione

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:

\left[ 10^{-308}, 10^{308} \right]

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 10^{-16}. Nella pratica, questo risultato ci dice che con il tipo double possiamo arrivare ad una precisione di circa 15 o 16 cifre significative.

Definizione

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:

3^{1000}

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:

1.797693134862316 \times 10^{308}

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, \infty, in matematica.

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 x con x che tende a zero sia da sinistra che da destra ottenendo i seguenti risultati:

\lim_{x \rightarrow 0^{+}} \frac{1}{x} = +\infty \quad \lim_{x \rightarrow 0^{-}} \frac{1}{x} = -\infty

Tuttavia, quando si ha a che fare con i calcoli numerici l'apparizione di Inf potrebbe nascondere problemi più gravi.

Ricapitolando:

Definizione

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, \infty, non rappresentano la stessa cosa.

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:

\frac{0}{0}

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.

Definizione

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 10^{-7} è possibile comprendere come con un 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.

Definizione

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.