Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Números de punto flotante

representa números de punto flotante en formato de precisión doble o de precisión simple.MATLAB® El valor predeterminado es la doble precisión, pero puede realizar cualquier número de precisión única con una función de conversión simple.

Punto flotante de precisión doble

construye el tipo de datos de precisión doble (o) según la norma 754 para doble precisión.MATLABdoubleIEEE® Cualquier valor almacenado como un requiere 64 bits, formateado como se muestra en la siguiente tabla:double

Bits

Uso

63

Signo (= positivo, = negativo)01

Para6252

Exponente, sesgado por1023

Para510

Fracción del númerof1.f

Punto flotante de precisión simple

construye el tipo de datos de precisión simple (o) de acuerdo con la norma 754 para una precisión única.MATLABsingleIEEE Cualquier valor almacenado como un requiere 32 bits, formateado como se muestra en la siguiente tabla:single

Bits

Uso

31

Signo (= positivo, = negativo)01

Para3023

Exponente, sesgado por127

Para220

Fracción del númerof1.f

Debido a que almacena números de tipo con 32 bits, requieren menos memoria que los números de tipo, que utilizan 64 bits.MATLABsingledouble Sin embargo, debido a que se almacenan con menos bits, los números de tipo se representan con menos precisión que los números de tipo.singledouble

Creación de datos de punto flotante

Utilice la precisión doble para almacenar valores superiores a aproximadamente 3,4 x 1038 o inferior a aproximadamente-3,4 x 1038. Para los números que se encuentran entre estos dos límites, puede usar una precisión doble o sencilla, pero solo requiere menos memoria.

Creación de datos de doble precisión

porque el tipo numérico predeterminado es, puede crear un con una instrucción de asignación simple:MATLABdoubledouble

x = 25.783; 

La función muestra que ha creado una matriz de 1 por 1 de tipo para el valor que acaba de almacenar en:whosMATLABdoublex

whos x   Name      Size                   Bytes  Class    x         1x1                        8  double 

Use si solo desea comprobar que es un número de punto flotante.isfloatx Esta función devuelve Logical 1 () si la entrada es un número de punto flotante, y Logical 0 () en caso contrario:truefalse

isfloat(x) ans =    logical     1

puede convertir otros datos numéricos, caracteres o cadenas, y datos lógicos a doble precisión utilizando la función,.MATLABdouble Este ejemplo convierte un entero con signo en punto flotante de precisión doble:

y = int64(-589324077574);          % Create a 64-bit integer  x = double(y)                      % Convert to double x =   -5.8932e+11

Creación de datos de precisión simple

Como los datos numéricos se almacenan de forma predeterminada, es necesario utilizar la función de conversión para crear un número de precisión simple:MATLABdoublesingle

x = single(25.783); 

La función devuelve los atributos de la variable en una estructura.whosx El campo de esta estructura muestra que cuando se almacena como un solo, requiere sólo 4 bytes en comparación con los 8 bytes para almacenarlo como:bytesxdouble

xAttrib = whos('x'); xAttrib.bytes ans =      4 

puede convertir otros datos numéricos, caracteres o cadenas, y datos lógicos a precisión única mediante la función.single Este ejemplo convierte un entero con signo en un punto flotante de precisión simple:

y = int64(-589324077574);          % Create a 64-bit integer  x = single(y)                      % Convert to single x =    single   -5.8932e+11

Operaciones aritméticas en números de punto flotante

En esta sección se describen las clases que se pueden utilizar en operaciones aritméticas con números de punto flotante.

Operaciones de doble precisión

Puede realizar operaciones aritméticas básicas con y cualquiera de las siguientes clases.double Cuando uno o más operandos es un entero (escalar o array), el operando debe ser un escalar.double El resultado es de tipo, excepto donde se indique lo contrario:double

  • — El resultado es de tiposinglesingle

  • double

  • o: el resultado tiene el mismo tipo de datos que el operando enteroint*uint*

  • char

  • logical

En este ejemplo se realiza la aritmética en datos de tipos y.chardouble El resultado es de tipo:double

c = 'uppercase' - 32;  class(c) ans =    double  char(c) ans =    UPPERCASE 

Operaciones de precisión simple

Puede realizar operaciones aritméticas básicas con y cualquiera de las siguientes clases.single El resultado es siempre:single

  • single

  • double

  • char

  • logical

En este ejemplo, 7,5 tiene como valor predeterminado el tipo y el resultado es de tipo:doublesingle

x = single([1.32 3.47 5.28]) .* 7.5;  class(x) ans =    single 

Los valores más grandes y más pequeños para las clases de punto flotante

Para las clases y, hay un número más grande y más pequeño que puede representar con ese tipo.doublesingle

Los valores de doble precisión más grandes y más pequeños

el funciones y devuelven los valores máximos y mínimos que puede representar con el tipo de datos:MATLABrealmaxrealmindouble

str = 'The range for double is:\n\t%g to %g and\n\t %g to  %g'; sprintf(str, -realmax, -realmin, realmin, realmax)  ans = The range for double is:    -1.79769e+308 to -2.22507e-308 and     2.22507e-308 to  1.79769e+308 

Números mayores o menores de los que se asignan a los valores de infinito positivo y negativo, respectivamente:realmax-realmax

realmax + .0001e+308 ans =    Inf  -realmax - .0001e+308 ans =   -Inf 

Los valores de precisión simple más grandes y más pequeños

el funciones y, cuando se llama con el argumento, devuelven los valores máximos y mínimos que puede representar con el tipo de datos:MATLABrealmaxrealmin'single'single

str = 'The range for single is:\n\t%g to %g and\n\t %g to  %g'; sprintf(str, -realmax('single'), -realmin('single'), ...     realmin('single'), realmax('single'))  ans = The range for single is:  -3.40282e+38 to -1.17549e-38 and   1.17549e-38 to  3.40282e+38

Números mayores o menores de los que se asignan a los valores de infinito positivo y negativo, respectivamente:realmax('single')-realmax('single')

realmax('single') + .0001e+038 ans =    single     Inf  -realmax('single') - .0001e+038 ans =    single    -Inf

Precisión de los datos de punto flotante

Si el resultado de un cálculo aritmético de punto flotante no es tan preciso como se esperaba, probablemente se debe a las limitaciones del hardware del equipo. Probablemente, el resultado fue un poco menos exacto porque el hardware tenía bits insuficientes para representar el resultado con una precisión perfecta; por lo tanto, truncó el valor resultante.

Precisión de doble precisión

Dado que solo hay un número finito de números de doble precisión, no puede representar todos los números en el almacenamiento de doble precisión. En cualquier equipo, hay un pequeño hueco entre cada número de doble precisión y el siguiente número de doble precisión más grande. Puede determinar el tamaño de este hueco, que limita la precisión de los resultados, utilizando la función.eps Por ejemplo, para encontrar la distancia entre y el siguiente número de doble precisión más grande, escriba5

format long  eps(5) ans =      8.881784197001252e-16

Esto le indica que no hay números de doble precisión entre 5 y.5 + eps(5) Si un cálculo de precisión doble devuelve la respuesta 5, el resultado solo es preciso en el interior.eps(5)

El valor de depende de.eps(x)x Este ejemplo muestra que, como se hace más grande, también lo hace:xeps(x)

eps(50) ans =      7.105427357601002e-15

Si escribe sin argumento de entrada, devuelve el valor de, la distancia desde el siguiente número más grande de precisión doble.epsMATLABeps(1)1

Precisión de precisión simple

Del mismo modo, hay huecos entre dos números de precisión simple. Si tiene tipo, devuelve la distancia entre y el siguiente número de precisión simple más grande.xsingleeps(x)x Por ejemplo,

x = single(5); eps(x) 

Devuelve

ans =    single    4.7684e-07

Tenga en cuenta que este resultado es mayor que.eps(5) Dado que hay menos números de precisión simple que los números de precisión doble, los huecos entre los números de precisión simple son mayores que los huecos entre los números de precisión doble. Esto significa que los resultados en aritmética de precisión simple son menos precisos que en aritmética de precisión doble.

Para un número de tipo, le da un límite superior para la cantidad que se redondea al convertirlo de a.xdoubleeps(single(x))xdoublesingle Por ejemplo, al convertir el número de precisión doble en, se redondea por3.14single

double(single(3.14) - 3.14) ans =    1.0490e-07

La cantidad que se redondea es menor que3.14

eps(single(3.14)) ans =    single    2.3842e-07

Evitar problemas comunes con aritmética de punto flotante

Casi todas las operaciones se realizan en aritmética de doble precisión conforme a la norma 754.MATLABIEEE Debido a que los equipos solo representan números a una precisión finita (llamadas de precisión doble para 52 bits de mantisa), los cálculos a veces producen resultados matemáticamente no intuitivos. Es importante tener en cuenta que estos resultados no son errores en.MATLAB

Utilice los siguientes ejemplos para ayudarle a identificar estos casos:

Ejemplo 1 — Round-OFF o lo que obtienes no es lo que esperas

El número decimal no es exactamente representable como una fracción binaria.4/3 Por esta razón, el siguiente cálculo no da cero, pero más bien revela la cantidad.eps

e = 1 - 3*(4/3 - 1)  e =    2.2204e-16

Del mismo modo, no es exactamente representable como un número binario.0.1 Por lo tanto, se obtiene el siguiente comportamiento no intuitivo:

a = 0.0; for i = 1:10   a = a + 0.1; end a == 1 ans =    logical     0

Tenga en cuenta que el orden de las operaciones puede importar en el cálculo:

b = 1e-16 + 1 - 1e-16; c = 1e-16 - 1e-16 + 1; b == c ans =    logical     0

Hay huecos entre los números de punto flotante. A medida que los números se hacen más grandes, también los huecos, como lo demuestran:

(2^53 + 1) - 2^53  ans =      0

Puesto que no es realmente π, no es de extrañar que no es exactamente cero:pisin(pi)

sin(pi)  ans =      1.224646799147353e-16

Ejemplo 2: cancelación catastrófica

Cuando las sustracciones se realizan con operandos casi iguales, a veces la cancelación puede producirse inesperadamente. El siguiente es un ejemplo de una cancelación causada por el inundando (pérdida de precisión que hace la adición insignificante).

sqrt(1e-16 + 1) - 1  ans =      0

Algunas funciones en, como y, se pueden utilizar para compensar los efectos de la cancelación catastrófica.MATLABexpm1log1p

Ejemplo 3: operaciones de punto flotante y álgebra lineal

El redondeo, la cancelación y otros rasgos de aritmética de punto flotante se combinan para producir cálculos sorprendentes al resolver los problemas del álgebra lineal. advierte que la siguiente matriz está mal condicionada y, por lo tanto, el sistema puede ser sensible a pequeñas perturbaciones:MATLABAAx = b

A = diag([2 eps]);  b = [2; eps];  y = A\b;  Warning: Matrix is close to singular or badly scaled.          Results may be inaccurate. RCOND = 1.110223e-16.

Estos son solo algunos de los ejemplos que muestran cómo la aritmética de punto flotante afecta a los cálculos.IEEEMATLAB Tenga en cuenta que todos los cálculos realizados en 754 aritmética se ven afectados, esto incluye las aplicaciones escritas en C o FORTRAN, así como.IEEEMATLAB

Referencias

[1] Moler, Cleve. “Floating Points.” MATLAB News and Notes. Fall, 1996.

[2] Moler, Cleve. Numerical Computing with MATLAB. Natick, MA: The MathWorks, Inc., 2004.