Numeri interi
Classi a numero intero
MATLAB® ha quattro classi a numero intero con segno e quattro classi a numero intero senza segno. I tipi con segno consentono di lavorare con numeri interi negativi e positivi, ma non possono rappresentare un intervallo di numeri così ampio come i tipi senza segno, poiché un bit viene utilizzato per indicare il segno positivo o negativo del numero. I tipi senza segno offrono un intervallo più ampio di numeri, ma tali numeri possono essere solo zero o positivi.
MATLAB supporta l'archiviazione di dati a numero intero a 1, 2, 4 e 8 byte. È possibile risparmiare memoria e tempo di esecuzione dei programmi utilizzando il numero intero più piccolo che può contenere i dati. Ad esempio, non è necessario un numero intero a 32 bit per memorizzare il valore 100.
La tabella sottostante mostra le otto classi a numero intero, l'intervallo di valori che è possibile memorizzare con ciascun tipo e la funzione di conversione di MATLAB necessaria per creare quel tipo.
Classe | Intervallo di valori | Funzione di conversione |
|---|---|---|
Numero intero a 8 bit con segno | Da –27 a 27–1 |
|
Numero intero a 16 bit con segno | Da –215 a 215–1 |
|
Numero intero a 32 bit con segno | Da –231 a 231–1 |
|
Numero intero a 64 bit con segno | Da –263 a 263–1 |
|
Numero intero a 8 bit senza segno | Da 0 a 28–1 |
|
Numero intero a 16 bit senza segno | Da 0 a 216–1 |
|
Numero intero a 32 bit senza segno | Da 0 a 232–1 |
|
Numero intero a 64 bit senza segno | Da 0 a 264–1 |
|
Creazione di dati a numero intero
Per impostazione predefinita, MATLAB memorizza i dati numerici in virgola mobile a doppia precisione (double). Per memorizzare i dati come numeri interi, è necessario convertire da double nel tipo a numero intero desiderato. Utilizzare una delle funzioni di conversione riportate nella tabella soprastante.
Ad esempio, per memorizzare 325 come numero intero con segno a 16 bit assegnato alla variabile x, digitare
x = int16(325);
Se il numero da convertire in un numero intero ha una parte frazionaria, MATLAB arrotonda al numero intero più vicino. Se la parte frazionaria è esattamente 0.5, MATLAB sceglie il numero intero più vicino il cui valore assoluto è maggiore in grandezza:
x = 325.499; int16(x)
ans = int16 325
x = x + .001; int16(x)
ans = int16 326
Se è necessario arrotondare un numero utilizzando uno schema di arrotondamento diverso da quello predefinito, MATLAB dispone di quattro funzioni di arrotondamento: round, fix, floor e ceil. La funzione fix consente di sovrascrivere il comportamento predefinito e arrotondare verso lo zero quando è presente una parte frazionaria diversa da zero:
x = 325.9; int16(fix(x))
ans = int16 325
Le operazioni aritmetiche che coinvolgono sia numeri interi che numeri in virgola mobile restituiscono sempre un tipo di dato a numero intero. Se necessario, MATLAB arrotonda il risultato in base all'algoritmo di arrotondamento predefinito. L'esempio seguente fornisce una risposta esatta di 1426.75 che MATLAB arrotonda poi al numero intero superiore più vicino:
int16(325)*4.39
ans = int16 1427
Le funzioni di conversione dei numeri interi possono inoltre essere utilizzate quando si convertono altre classi, come i vettori di caratteri, in numeri interi:
chr = 'Hello World';
int8(chr)ans =
1×11 int8 row vector
72 101 108 108 111 32 87 111 114 108 100Se si converte un valore NaN in una classe a numero intero, il risultato è un valore di 0 in tale classe a numero intero. Ad esempio:
int32(NaN)
ans = int32 0
Operazioni aritmetiche su classi a numero intero
MATLAB può eseguire operazioni aritmetiche con numeri interi sui seguenti tipi di dato:
Numeri interi o array di numeri interi dello stesso tipo di dato a numero intero. Le operazioni aritmetiche producono un risultato che ha lo stesso tipo di dato degli operandi:
x = uint32([132 347 528]) .* uint32(75); class(x)
ans = 'uint32'
Numeri interi o array di numeri interi e numeri scalari in virgola mobile a doppia precisione. Le operazioni aritmetiche producono un risultato che ha lo stesso tipo di dato degli operandi a numero intero:
x = uint32([132 347 528]) .* 75.49; class(x)
ans = 'uint32'
Per tutte le operazioni binarie in cui un operando è un array del tipo di dato a numero intero (ad eccezione dei numeri interi a 64 bit) e l'altro è uno scalare double, MATLAB calcola l'operazione utilizzando l'aritmetica a doppia precisione elemento per elemento, quindi riconverte il risultato nel tipo dato a numero intero originale. Per le operazioni binarie che coinvolgono un array di numeri interi a 64 bit e uno scalare double, MATLAB calcola l'operazione come se fosse utilizzata l'aritmetica a precisione estesa a 80 bit, per evitare la perdita di accuratezza.
Le operazioni che coinvolgono numeri complessi con tipi a numero intero non sono supportate.
Valori massimi e minimi delle classi a numero intero
Per ciascun tipo di dato a numero intero, esiste un numero massimo e minimo che è possibile rappresentare con quel tipo. La tabella riportata sotto Classi a numero intero elenca i valori massimi e minimi per ciascun tipo di dato a numero intero nella colonna "Intervallo di valori".
È inoltre possibile ottenere questi valori con le funzioni intmax e intmin:
intmax("int8")ans = int8 127
intmin("int8")ans = int8 -128
Se si converte un numero maggiore del valore massimo del tipo di dato a numero intero in quel tipo, MATLAB lo imposta sul valore massimo. In modo analogo, se si converte un numero inferiore al valore minimo del tipo di dato a numero intero, MATLAB lo imposta sul valore minimo. Ad esempio:
x = int8(300)
x = int8 127
x = int8(-300)
x = int8 -128
Inoltre, quando il risultato di un'operazione aritmetica che coinvolge numeri interi supera il valore massimo (o minimo) del tipo di dato, MATLAB lo imposta sul valore massimo (o minimo):
x = int8(100)*3
x = int8 127
x = int8(-100)*3
x = int8 -128
Perdita di precisione dovuta alla conversione
Per impostazione predefinita, quando si crea un array numerico di numeri interi di grandi dimensioni (maggiori di flintmax), MATLAB rappresenta inizialmente l'input come doppia precisione. La precisione può andare persa quando si converte questo input nel tipo di dato int64 o uint64. Per mantenere la precisione, chiamare invece int64 o uint64 con ciascun elemento scalare dell'array.
Ad esempio, convertire un array numerico di numeri interi di grandi dimensioni in un array di numeri interi con segno a 64 bit utilizzando int64. L'array di output perde precisione.
Y_inaccurate = int64([-72057594035891654 81997179153022975])
Y_inaccurate = 1×2 int64 row vector
-72057594035891656 81997179153022976Chiamare invece int64 con ciascun elemento scalare per restituire un array accurato.
Y_accurate = [int64(-72057594035891654) int64(81997179153022975)]
Y_accurate = 1×2 int64 row vector
-72057594035891654 81997179153022975È anche possibile creare l'array di numeri interi senza perdita di precisione utilizzando i valori esadecimali o binari dei numeri interi.
Y_accurate = [0xFF000000001F123As64 0x1234FFFFFFFFFFFs64]
Y_accurate = 1×2 int64 row vector
-72057594035891654 81997179153022975