Valores enteros
Clases de enteros
MATLAB® tiene cuatro clases de enteros con signo y cuatro sin signo. Los tipos con signo le permiten trabajar con enteros negativos y positivos, pero no pueden representar un rango de números tan amplio como los tipos sin signo, ya que se utiliza un bit para designar un signo positivo o negativo del número. Los tipos sin singo le ofrecen un amplio rango de números, pero estos números solo pueden ser cero o positivos.
MATLAB admite almacenamiento de 1, 2, 4 y 8 bytes para datos enteros. Puede ahorrar memoria y tiempo de ejecución de los programas si utiliza el tipo de entero más pequeño que admitan sus datos. Por ejemplo, no necesita un valor entero de 32 bits para almacenar el valor 100
.
Estas son las ocho clases de enteros, el rango de valores que puede almacenar con cada tipo y la función de conversión de MATLAB necesaria para crear ese tipo.
Clase | Rango de valores | Función de conversión |
---|---|---|
Valor entero de 8 bits con signo | –27 a 27–1 |
|
Valor entero de 16 bits con signo | –215 a 215–1 |
|
Valor entero de 32 bits con signo | –231 a 231–1 |
|
Valor entero de 64 bits con signo | –263 a 263–1 |
|
Valor entero de 8 bits sin signo | 0 a 28–1 |
|
Valor entero de 16 bits sin signo | 0 a 216–1 |
|
Valor entero de 32 bits sin signo | 0 a 232–1 |
|
Valor entero de 64 bits sin signo | 0 a 264–1 |
|
Creación de datos enteros
De forma predeterminada, MATLAB almacena datos numéricos como de punto flotante de doble precisión (double
). Para almacenar datos como un entero, necesita convertir de double
al tipo de entero que desee. Utilice una de las funciones de conversión que se muestran en la tabla anterior.
Por ejemplo, para almacenar 325
como un entero de 16 bits con signo asignado a la variable x
, escriba
x = int16(325);
Si el número que se quiere convertir en un entero tiene una parte fraccionaria, MATLAB lo redondea al entero más próximo. Si la parte fraccionaria es exactamente 0.5
, MATLAB elige el entero más próximo cuyo valor absoluto es mayor en magnitud:
x = 325.499; int16(x)
ans = int16 325
x = x + .001; int16(x)
ans = int16 326
Si necesita redondear un número utilizando un esquema de redondeo distinto del predeterminado, MATLAB le proporciona cuatro funciones de redondeo: round
, fix
, floor
y ceil
. La función fix
le permite sobrescribir el valor predeterminado y redondear a cero cuando hay una parte fraccionaria distinta de cero:
x = 325.9; int16(fix(x))
ans = int16 325
Las operaciones aritméticas que incluyen tanto valores enteros como números de punto flotante siempre resultan en un tipo de datos enteros. MATLAB redondea el resultado, cuando es necesario, según el algoritmo de redondeo predeterminado. El siguiente ejemplo produce una respuesta exacta de 1426.75
, que MATLAB redondea después al siguiente valor entero más alto:
int16(325)*4.39
ans = int16 1427
Las funciones de conversión de enteros también resultan útiles cuando convierte otras clases, como vectores de caracteres, a valores enteros:
chr = 'Hello World';
int8(chr)
ans = 1×11 int8 row vector 72 101 108 108 111 32 87 111 114 108 100
Si convierte un valor NaN
a una clase de enteros, el resultado es un valor de 0
en esa clase de enteros. Por ejemplo:
int32(NaN)
ans = int32 0
Operaciones aritméticas en clases de enteros
MATLAB puede realizar operaciones aritméticas de enteros sobre los siguientes tipos de datos:
Valores enteros o arreglos de enteros del mismo tipo de datos enteros. Las operaciones aritméticas producen un resultado que tiene el mismo tipo de datos que los operandos:
x = uint32([132 347 528]) .* uint32(75); class(x)
ans = 'uint32'
Valores enteros o arreglos de enteros y números escalares de punto flotante de doble precisión. Las operaciones aritméticas producen un resultado que tiene el mismo tipo de datos que los operandos de enteros:
x = uint32([132 347 528]) .* 75.49; class(x)
ans = 'uint32'
Para todas las operaciones binarias en las que un operando sea un tipo de datos de arreglo de enteros (excepto enteros de 64 bits) y el otro sea un doble escalar, MATLAB calcula la operación utilizando aritmética de doble precisión elemento por elemento y, a continuación, convierte el resultado de nuevo en el tipo de datos de enteros original. Para operaciones binarias que implican un arreglo de enteros de 64 bits y un doble escalar, MATLAB calcula la operación como si se utilizase aritmética de precisión extendida de 80 bits para evitar la pérdida de precisión.
No se admiten operaciones que implican números complejos con tipos de enteros.
Valores más grandes y más pequeños para clases de enteros
Para cada tipo de datos enteros, existe un número más grande y más pequeño que puede representar con ese tipo. La tabla que se muestra en Clases de enteros enumera los valores más grandes y más pequeños para cada tipo de datos enteros en la columna "Rango de valores".
También puede obtener estos valores con las funciones intmax
e intmin
:
intmax("int8")
ans = int8 127
intmin("int8")
ans = int8 -128
Si convierte un número que supere el valor máximo de un tipo de datos enteros a ese tipo, MATLAB lo establece en el valor máximo. De forma similar, si convierte un número que sea más pequeño que el valor mínimo del tipo de datos enteros, MATLAB lo establece en el valor mínimo. Por ejemplo:
x = int8(300)
x = int8 127
x = int8(-300)
x = int8 -128
Además, cuando el resultado de una operación aritmética que implica valores enteros supera el valor máximo (o mínimo) del tipo de datos, MATLAB lo establece en el valor máximo (o mínimo):
x = int8(100)*3
x = int8 127
x = int8(-100)*3
x = int8 -128
Pérdida de precisión debido a la conversión
Cuando crea un arreglo numérico de enteros grandes (mayores que flintmax
), MATLAB representa inicialmente la entrada como doble precisión de forma predeterminada. Se puede perder precisión si convierte esta entrada en el tipo de datos int64
o uint64
. Para mantener la precisión, llame a int64
o uint64
con cada elemento escalar del arreglo.
Por ejemplo, convierta un arreglo numérico de enteros grandes en un arreglo de enteros con signo de 64 bits usando int64
. El arreglo de salida pierde precisión.
Y_inaccurate = int64([-72057594035891654 81997179153022975])
Y_inaccurate = 1×2 int64 row vector
-72057594035891656 81997179153022976
En su lugar, llame a int64
con cada elemento escalar para que devuelva un arreglo preciso.
Y_accurate = [int64(-72057594035891654) int64(81997179153022975)]
Y_accurate = 1×2 int64 row vector
-72057594035891654 81997179153022975
También puede crear el arreglo de enteros sin perder precisión usando los valores binarios o hexadecimales de los enteros.
Y_accurate = [0xFF000000001F123As64 0x1234FFFFFFFFFFFs64]
Y_accurate = 1×2 int64 row vector
-72057594035891654 81997179153022975