2010-09-13 19 views
5

Estoy teniendo problemas para entender cómo la precisión de estos dobles afecta el resultado de las operaciones aritméticas en Matlab. Pensé que dado que ambos, un & b, son dobles, podrían llevar a cabo operaciones con esa precisión. Me doy cuenta de que puede haber un error de redondeo, pero dado que estos números están dentro de la representación numérica de 64 bits, no pensé que eso sería un problema.Precisión aritmética con dobles en Matlab

a = 1.22e-45 
b = 1 
a == 0 
    ans = 0 %a is not equal to zero 
(a + b) == 1 
    ans = 1 

¿Cómo es que es capaz de llevar la suficiente precisión para reconocer una! = 0, pero cuando se añade a 1 que no muestra ningún cambio.

Respuesta

6

Los números de punto flotante IEEE-754 de 64 bits tienen suficiente precisión (con una mantisa de 53 bits) para representar aproximadamente 16 dígitos decimales significativos. Pero requiere más como 45 dígitos decimales significativos para diferenciar entre (1 + a) = 1.00 .... 000122 y 1.000 para su ejemplo.

+0

Creo que la mantisa tiene 52 bits (11 bits para el exponente, más 1 bit para el signo que hace un total de 64 bits). Un excelente artículo de * Cleve Moler * (autor de la primera versión de MATLAB) explica todos los detalles de los números flotantes: [enlace PDF] http://www.mathworks.com/company/newsletters/news_notes/pdf/Fall96Cleve. pdf – Amro

+2

@Amro: hay un bit implícito "1", a menos que el número se desnormalice. Así que Jim tiene razón, en la mayoría de los casos (y ciertamente para estos números). –

+0

Gracias. Aún tengo mucho camino por recorrer para comprender las representaciones numéricas en las computadoras. – ZuluForce

6

El punto "flotante" significa precisamente eso: la precisión es relativa a la escala del número en sí.

En el ejemplo específico que dio, 1.22e-45 puede representarse solo porque el exponente se puede ajustar para representar 10^-45, o aproximadamente 2^-150.

Por otro lado, 1.0 se representa en binario con escala 2^0 (es decir, 1).

Para agregar estos dos valores, debe alinear sus puntos decimales (er ... puntos binarios), lo que significa que toda la precisión de 1.22e-45 se desplaza 150 bits impares a la derecha.

Por supuesto, los valores de coma flotante de doble precisión IEEE solo tienen 53 bits de mantisa (precisión), lo que significa que a la escala de 1.0, 1.22e-45 es efectivamente cero.

+0

¡Muchas gracias! – ZuluForce

3

Para agregar a lo que han dicho las otras respuestas, puede usar la función MATLAB EPS para visualizar el problema de precisión que se está ejecutando. Para un número de coma flotante determinado con precisión doble, la función EPS le dirá la distancia de éste al siguiente número de punto flotante representable más grande:

>> a = 1.22e-45; 
>> b = 1; 
>> eps(b) 

ans = 

    2.2204e-016 

Tenga en cuenta que el siguiente número de coma flotante que es mayor que 1 es 1.00000000000000022204 ..., y el valor de a ni siquiera se acerca a la mitad de la distancia entre los dos números. Por lo tanto a+b termina quedándose 1.

Por cierto, también se puede ver por qué a se considera distinto de cero a pesar de que es tan pequeño observando el más pequeño de doble precisión representable valor de coma flotante utilizando la función REALMIN:

>> realmin 

ans = 

    2.2251e-308 %# MUCH smaller than a! 
Cuestiones relacionadas