Download Java-Tipos de datos numericos - Escuela de Ingeniería Industrial
Document related concepts
Transcript
Errorres “Nuestras bombas inteligentes cometen errores no mayores a los 5 cm.” Representación computacional de tipos de datos numéricos (Guerra de Irak) Franco Guidi Polanco Pontificia Universidad Católica de Valparaíso, Chile Escuela de Ingeniería Industrial fguidi@ucv.cl Actualización: 14 de marzo de 2007 Franco Guidi Polanco (PUCV-EII) 14/03/2007 2 Errores: Roundoff Errores: definiciones Es la diferencia entre un valor exacto y el valor mediante el cual se lo puede representar. Ejemplo: si utilizamos el tipo de dato float: Error absoluto: | (valor obtenido) – (valor correcto) | Error relativo: (error absoluto) (valor correcto) Porcentaje de error: (error relativo) * 100 [%] Franco Guidi Polanco (PUCV-EII) 14/03/2007 3 Franco Guidi Polanco (PUCV-EII) 1/2 0,5 1/3 0,33333334 1/4 0,25 1/5 0,2 1/6 0,16666667 1/7 0,14285715 14/03/2007 4 Errores: Cancelación Números decimales Los números decimales nos permiten representar fracciones. Algunas fracciones tienen representación exacta como numero decimal (en base 10): en su expresión simplificada, sus denominadores dividen en forma exacta alguna potencia de 10. Ejemplos: Occurre cuando la mayoría de los dígitos significativos se pierde durante la sustracción de dos números muy similares. Por ejemplo, teóricamente: 1 10.000.001 20.000.000 - 1 2 = 20.000.000 Debe ser: 0,50000005 Fracción Pero si las operaciones se realizan con datos float: 1 = 0,50000006 - 0,5 1 5,960464E-8 = 1,6777216E-8 Porcentaje error: 16,11% Franco Guidi Polanco (PUCV-EII) 14/03/2007 5 Representación inexacta de fracciones reales Franco Guidi Polanco (PUCV-EII) 0,3333... (0,3) 1/6 0,1666... (0,16) 1/7 0,142857142857.... (0,142857) 1/9 0,1111... 14/03/2007 1/2 0,5 10 (10/2=5) 1/4 0,25 102 (100/4=25) 1/5 0,2 10 (10/5=2) 1/8 0,125 103 (1000/8=125) Franco Guidi Polanco (PUCV-EII) 14/03/2007 6 La Java Virtual Machine representa los valores numéricos en base 2. Las variables numéricas para almacenar valores en punto flotante son de capacidad limitada. Por lo tanto pueden ser representadas exactamente aquellas fracciones (simplificadas) cuyo denominador divida exactamente una potencia de 2, y cuya cantidad de decimales no exceda la capacidad del tipo. Ejemplos: Número decimal 1/3 Potencia de 10 Representación de fracciones en computadores Las fracciones simplificadas cuyos denominadores no dividen en forma exacta alguna potencia de 10, no tienen representación exacta como número decimal (en base 10). Ejemplos: Fracción Número decimal 1/2 1/4 1/5 (0,1) 7 Franco Guidi Polanco (PUCV-EII) 14/03/2007 8 Matemática “pura” v/s matemática “computacional” Precisión y exactitud Los números en punto flotante: Para los valores en punto flotante se define: Los números reales: Precisión: representa la cantidad de dígitos significativos que tiene su mantisa (“significand”). En Java los valores double son más precisos que los float. Son infinitos (no hay primero ni último) Exactitud: representa qué tan próximo se encuentra un valor en punto flotante, respecto de su valor correcto. Son contínuos (entre dos números reales existe siempre otro número real) Son acotados Son discretos Valor real 1/3 0,3333333f Más exacto 1/3 0,344444444444444 (double) Más preciso Franco Guidi Polanco (PUCV-EII) 14/03/2007 Tienen precisión infinita (tienen la cantidad de decimales que sean necesarios) 9 Franco Guidi Polanco (PUCV-EII) Tienen precisión limitada 14/03/2007 10 Tipos de datos enteros en Java Java ofrece los siguientes tipos de datos enteros: Tipo Valores Enteros Tamaño Valor mínimo (Bits) Valor máximo byte 8 -128 127 short 16 -32.768 32.767 int 32 -2.147.483.648 2.147.483.647 long 64 -9.223.372.036.854.775.808 9.223.372.036.854.775.807 char 16 0 Franco Guidi Polanco (PUCV-EII) 65.535 14/03/2007 12 Representación interna (positivos) Operaciones en Java Para el tipo byte: Recordar que: 0 0 0 0 0 0 0 0 02 = 0 * 20 = 010 0 0 0 0 0 0 0 1 12 = 1 * 20 = 110 0 0 0 0 0 0 1 0 102 = 1*21 + 0*20 = 210 0 0 0 0 0 0 1 1 112 = 1*21 + 1*20 = 310 0 0 0 0 0 1 0 0 1002 = 1*22 + 0*21 +0*20 = 410 0 1 1 1 1 1 1 1 26 25 24 23 22 21 20 Franco Guidi Polanco (PUCV-EII) 1111112 = 1*26 + 1*25 + 1*24 + 1*23 + 1*22 + 1*21 +1*20 = 12710 14/03/2007 13 Franco Guidi Polanco (PUCV-EII) 14/03/2007 Supongamos la existencia de un tipo de dato entero llamado “by” (la mitad de un byte), que almacena números enteros de 4 bits. Utilizaremos 3 bits para representar la parte numérica y uno (el primero de la izquierda) para el signo: Signed magnitude (magnitud con signo) es una forma de codificar los número negativos : Números positivos: bit de signo igual a 0 Números negativos: bit de signo igual 1 Ejemplo: 0 0000 -0 1000 1 0001 -1 1001 2 0010 -2 1010 3 0011 -3 1011 4 0100 -4 1100 5 0101 -5 1101 6 0110 -6 1110 7 0111 -7 1111 14/03/2007 14 Representación de números negativos: “signed magnitude” Representación de números negativos Franco Guidi Polanco (PUCV-EII) Operaciones de dos variables byte o short generan un resultado int. Operaciones de dos valores int generan como resultado un int. Operaciones que involucran al menos un long generan como resultado un long. 15 Franco Guidi Polanco (PUCV-EII) ¿Inconvenientes? 14/03/2007 16 Representación de números negativos: “two’scomplement” Problemas al utilizar signed magnitude Two’s-complement (complemento de dos) codifica los números negativos de la siguiente forma: Dos características indeseables: Existen dos ceros, uno positivo y otro negativo 0000 +0 1000 -0 Los números positivos se representan “normalmente” Los números negativos se representan complementando cada bit del número positivo correspondiente, y luego sumando 1 al resultado En cualquier caso, el bit de la izquierda representa el signo (0: positivo, 1: negativo) No se puede utilizar la lógica normal de suma de enteros: 6 + -3 =3 + 0110 1011 0001 -3 6 -3 1 x Franco Guidi Polanco (PUCV-EII) + Ejemplo: representación del número -6 + -2 =-5 1011 1010 0101 -3 -2 5 x 14/03/2007 Franco Guidi Polanco (PUCV-EII) 0000 -2 1110 1 0001 -3 1101 2 0010 -4 1100 3 0011 -5 1011 4 0100 -6 1010 5 0101 -7 1001 6 0110 -8 1000 7 0111 14/03/2007 1001 1 Franco Guidi Polanco (PUCV-EII) 1011 14/03/2007 18 Representación de números negativos: “two’scomplement” Entonces los “by” serán los siguientes: 0 Complementar cada bit Valor 6 negativo (-6) Representación de números negativos: “two’scomplement” 1111 0110 Sumar 1 17 -1 Número positivo correspondiente (6) Operaciones de suma: 6 + -3 =3 0110 + 1101 0011 19 Franco Guidi Polanco (PUCV-EII) -3 + -2 =-5 1011 + 1110 1001 6 -3 3 14/03/2007 -3 -2 -5 20 Java y representación de enteros El conjunto de los números enteros En Java se representan utilizando “two’scomplement” los siguientes tipos enteros: En los números enteros: short byte int long -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 El conjunto de los enteros es “cerrado” respecto de la adición y sustracción (…¡y éstas no fallan!) El tipo char no tiene bit de signo, todos sus bits representan 0 ó un número positivo. 2+4=6 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 4 - 6 = -2 Franco Guidi Polanco (PUCV-EII) 14/03/2007 21 Los números enteros en Java… 0000 1110 -1 -2 1101 1100 1011 2 0011 4 -5 5 -6 1110 -7 1001 -8 1000 14/03/2007 7 6 -1 0100 1100 0101 1011 0110 Franco Guidi Polanco (PUCV-EII) 0010 1 2 0011 3 -4 4 -5 5 -6 -7 1001 23 0001 -3 1010 0111 0 -2 1101 3 -4 0000 1111 0010 1 22 Ejemplo de suma: 2 + 3 = 5 0001 -3 1010 Franco Guidi Polanco (PUCV-EII) 0 14/03/2007 Los números enteros en Java… Podemos imaginar los “by” ordenados en círculo: 1111 Franco Guidi Polanco (PUCV-EII) -8 1000 14/03/2007 7 6 0100 0101 0110 0111 24 Los números enteros en Java… Los números enteros en Java… Ejemplo de suma: 6 + 2 = -8 …¿? 0000 1111 1110 -1 -2 1101 1100 1011 0 0001 1110 2 0011 -4 4 -5 -7 1010 1001 -8 1000 7 1100 0100 5 0101 6 -1 1011 0110 0001 0010 1 2 -3 0011 3 -4 4 -5 0100 5 -6 -7 1010 0111 0 -2 1101 3 ¡! 0000 1111 0010 1 -3 -6 Una resta: -6 – 4 = 6 … 1001 -8 1000 7 0101 6 0110 0111 Overflow! Franco Guidi Polanco (PUCV-EII) 14/03/2007 25 Los números enteros en Java… Franco Guidi Polanco (PUCV-EII) Entonces… mis programas anteriores… ¿funcionaban correctamente? Pensar en los ciclos iterativos que incrementan contadores, en simples operaciones de aritméticas que pasan por valores positivos y negativos… sin control alguno… etc. “Overflows can be silent killers of integer arithmetic!” 14/03/2007 26 Los números enteros en Java… La aritmética de enteros no genera tipo de aviso alguno (mensaje de error, excepción, etc.) cuando las operaciones de enteros producen resultados “incorrectos” (no hay excepciones de overflow). Franco Guidi Polanco (PUCV-EII) 14/03/2007 - Ronald Mak 27 Franco Guidi Polanco (PUCV-EII) 14/03/2007 28 Wrapper classes para tipos enteros en Java Java ofrece wrapper classes para almacenar valores enteros: Byte Short Integer Long Ejemplo: Valores en punto flotante Integer num = new Integer( 140 ); Estas clases ofrecen constantes y métodos útiles. Entre éstos las constantes MIN_VALUE y MAX_VALUE, que representan valor mínimo y máximo de cada tipo. Franco Guidi Polanco (PUCV-EII) 14/03/2007 29 Los números en punto flotante Los números en punto flotante La distribución de los anteriores en la recta numérica sería: Supongamos la existencia de un formato punto flotante que tiene una mantisa (f) de 1 dígito, y un exponente (e) de 1 dígito, todos en base 10: f e = -1 0 0* 10-1 e=0 e=1 0* 100 1 1* 10-1 =0 0 * 101 = 0 1* 100 =1 1 * 101 = 10 2 2 * 10-1 = 0,2 2 * 100 = 2 2 * 101 = 20 3 3 * 10-1 = 0,3 3 * 100 = 3 3 * 101 = 30 4 4 * 10-1 = 0,4 4 * 100 = 4 4 * 101 = 40 5* 100 =5 5 * 101 = 50 6* 100 =6 6 * 101 = 60 5 = 0 = 0,1 5* 10-1 6 6* 10-1 7 7 * 10-1 = 0,7 7 * 100 = 7 7 * 101 = 70 8 8 * 10-1 = 0,8 8 * 100 = 8 8 * 101 = 80 100 9 * 101 = 90 9 Franco Guidi Polanco (PUCV-EII) 9* 10-1 = 0,5 = 0,6 = 0,9 14/03/2007 9* =9 e=-1 0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 6 7 0,8 0,9 1 8 9 10 e=0 0 0,5 1 2 3 4 5 e=1 01 31 5 10 Franco Guidi Polanco (PUCV-EII) 20 14/03/2007 30 40 90 32 Los números son representados en forma binaria Error de redondeo (roundoff): diferencia entre un valor exacto y el valor que lo puede representar. Considerar significante de de 2 bits y exponente de 2 bits f e = -11 e = -10 e = -01 e = 00 e=01 e=10 e=11 1.00 0.001002= 0.12510 0.01002= 0.2510 0.1002= 0.510 1.002= 1.0010 10.02= 210 1002= 410 1000= 810 1.01 0.001012= 0.1562510 0.01012= 0.312510 0.1012= 0.62510 1.012= 1.2510 10.12= 2.510 1012= 510 10102= 1010 1.10 0.001102= 0.187510 0.01102= 0.37510 0.1102= 0.7510 1.102= 1.510 11.02= 310 1102= 610 11002= 1210 1.11 0.001112= 0.2187510 0.01112= 0.437510 0.1112= 0.87510 1.112= 1.7510 11.12= 3.510 1112= 710 11102= 1410 Franco Guidi Polanco (PUCV-EII) 14/03/2007 Conceptos revisitados 33 Precisión (precision): es la medida del número de dígitos significativos de la mantisa de un valor en punto flotante. Exactitud (accuracy): representa qué tan “correcto” es un valor en punto flotante, esto es, qué tan cercano a su valor exacto. Franco Guidi Polanco (PUCV-EII) 14/03/2007 Las Leyes del Algebra: Propiedad Asociativa (cont.) Las Leyes del Algebra: Propiedad Asociativa Ejemplo: El álgebra de los números reales cumple la propiedad asociativa de la suma y la multiplicación: Sea a = 1.0f b = 3.0E-8f c = 4.0E-8f (a + b) + c = a + (b + c) (ab)c = a(bc) La aritmética de punto flotante en Java no cumple con tales propiedades (ver ejemplo en siguiente transparencia). (1.00000000) (0.00000003) (0.00000004) ? (a + b) + c = a + (b + c) ? 1.0 + (3.0E-8 + 4.0E-8) (1.0 + 3.0E-8) + 4.0E-8 = 1.00000003 (roundoff) 1.0 ? + 4.0E-8 = 1.0 + (roundoff) 1.0 Franco Guidi Polanco (PUCV-EII) 14/03/2007 34 35 Franco Guidi Polanco (PUCV-EII) = 14/03/2007 7.0E-8 (roundoff) 1.0000001 36 Las Leyes del Algebra: Propiedad Asociativa (cont.) Propiedad Asociativa: ¿Porcentaje de fallas? Ejemplo: Ronald Mak1 muestra un simple experimento en el cual se prueba la propiedad asociativa de la suma y multiplicación de tres números float2: Sea a = 0.5f b = 1.0E-45f c = 3.0E38f 17% de fallas en la suma 34% de fallas en la multiplicación ? (a * b) * c = a * (b * c) ? (0.5f * 1.0E-45) * 3.0E38 = 0.5 * (1.0E-45 * 3.0E38) 0.5 * 1.4E-45 (underflow) 0.0 ? * 3.0E-38 = 0.5 * 0.0 Franco Guidi Polanco (PUCV-EII) = Java Number Cruncher. The Java Programmer’s Guide To Numerical Computing 2 Números float generados al azar, 1.000.000 de pruebas 1 1.4E-45 * 3.0E38 4.2038954E-7 2.1019477E-7 14/03/2007 37 Las Leyes del Algebra: Propiedad Distributiva e Inverso Multiplicativo Franco Guidi Polanco (PUCV-EII) 38 Las Leyes del Algebra: Propiedad Conmutativa Propiedad distributiva: Sobre la suma: a*(b + c ) = a*b + a*c a+b=b+a Falla! Sobre la multiplicación: a*b=b*a Inverso multiplicativo: Si a !=0 14/03/2007 a*(1/a ) = (1/a)*a = 1 Falla! ¡Funciona! Ejercicio: generar ejemplos Franco Guidi Polanco (PUCV-EII) 14/03/2007 39 Franco Guidi Polanco (PUCV-EII) 14/03/2007 40 El estándar Floating Point IEEE 754 El estándar Floating Point IEEE 754 Inicialmente había diferentes formatos de valores punto flotante implementados en hardware y software Especifica: Resultados de operaciones variaban al cambiar de plataforma En 1985 se estableció el estándar IEEE 754, al cual hoy adhieren muchos sistemas. formatos numéricos operaciones conversiones excepciones Java adhiere al estándar: tipo float: formato 32 bit de precisión simple tipo double: formato 64 bit de doble precisión IEEE: Institute of Electrical and Electronics Engineers Franco Guidi Polanco (PUCV-EII) 14/03/2007 41 IEEE 754: Formato Numérico Exponente: No tiene signo (siempre positivo) En float toma valores entre 0 y 255 (pero ambos son reservados) En double toma valores entre 0 y 2047 (pero ambos son reservados) El valor almacenado es sesgado El valor auténtico, insesgado, (E) se obtiene restando el “sesgo” al valor sesgado: Ejemplo (float): • Sesgo formato float: 127 f 23 32 bit s 1 e 11 f 52 • Sesgo formato double: 1023 14/03/2007 e = 315 E = 315 – 127 = 188 e = 25 E = 25 – 127 = -102 64 bit Franco Guidi Polanco (PUCV-EII) 42 Bit de signo: 0 (positivo) y 1 (negativo) Bit de signo (s) Exponente (e) Fracción (f) e 8 14/03/2007 IEEE 754: Formato Numérico (cont.) Cada número se divide en tres partes: s 1 Franco Guidi Polanco (PUCV-EII) 43 Franco Guidi Polanco (PUCV-EII) 14/03/2007 44 IEEE 754 Formato Numérico: exponente IEEE 754 Números Normalizados s 1 Tabla de valores posibles del exponente: Valor sesgado Valores reservados sesgados Valores admisibles sesgados Sesgo float 0 .. +255 0 y +255 +1 .. 254 +127 double 0.. +2047 0 y +2047 +1 .. +2046 +1023 Franco Guidi Polanco (PUCV-EII) -126 .. +127 El bit de signo determina el signo del número (1: negativo, 0: positivo) Se asumen un 1 y un punto decimal implícitos delante del primer bit de la fracción: 1.f Se mueve el punto decimal tantas posiciones (a la derecha o izquierda) como lo indique el valor del exponente insesgado (positivo o negativo). -1022 .. +1023 45 Franco Guidi Polanco (PUCV-EII) 14/03/2007 46 IEEE 754 Números Normalizados Ejemplo: el menor float positivo Ejemplo: s=0 e = 011111012 = 12510 f =100000000000000000000002 s=0 e = 000000012 = 110 f =000000000000000000000002 Entonces: Entonces: E = 12510 –12710 = -210 Significante = 1.100000000000000000000002 Número = 0.0112 Número = 0 * 20 + 0 * 2-1 + 1 * 2-2 + 1 * 2-3 = 0 + 0 + 1/4 + 1/8 = 0.25 + 0.125 = 0.375 Franco Guidi Polanco (PUCV-EII) (float) Si el exponente no es valor reservado (0 ó 255 para float, 0 ó 2047 para double), el número se interpreta de la siguiente forma: IEEE 754 Números Normalizados f 23 32 bit Valores (admisibles) insesgados 14/03/2007 e 8 14/03/2007 E = 110 – 12710 = -12610 Significante = 1.000000000000000000000002 Número = 0 * 2-1 + 0 * 2-2 + ... + 0 * 2-125 + 1 * 2-126 = (aprox) 1.1755E-38 47 Franco Guidi Polanco (PUCV-EII) 14/03/2007 48 IEEE 754 Números Normalizados Java y los Números Desnormalizados Ejemplo: el máximo float El número normalizado positivo más pequeño tipo float es aprox. 1.1755E-38 s=0 e = 111111102 = 25410 f =111111111111111111111112 Luego, el número inmediatamente anterior es 0 Entonces: Los números desnormalizados explotan los valores reservados del exponente para generar nuevos rangos de valores. E = 25410 – 12710 = 12710 Mantisa = 1.111111111111111111111112 Número = aprox. 3.4E38 Franco Guidi Polanco (PUCV-EII) 14/03/2007 49 Franco Guidi Polanco (PUCV-EII) Java y los Números Desnormalizados El número desnormalizado positivo más pequeño tipo float es: e = 0 (valor reservado), y f != 0 Se interpreta: Se asumen un 0 y un punto decimal implícitos delante del primer bit de la fracción: 0.f En el caso de un float, se mueve el punto decimal implícito 126 posiciones a la izquierda En el caso de un double, se mueve el punto decimal implícito 1022 posiciones a la izquierda El valor del bit de signo determina el signo del numero (0: positivo, 1: negativo) 14/03/2007 50 Java y los Números Desnormalizados Número desnormalizado (o subnormal): Franco Guidi Polanco (PUCV-EII) 14/03/2007 s=1 e=0 f =000000000000000000000012 mantisa = 0.000000000000000000000012 Número = 2-149 = aprox = 1.4E-45 El número desnormalizado positivo más grande tipo float es: 51 s=1 e=0 f =111111111111111111111112 mantisa = 0.111111111111111111111112 Número = aprox 1.2E-38 Franco Guidi Polanco (PUCV-EII) 14/03/2007 52 Java y los Números Desnormalizados Operaciones en punto flotante Mediante los números desnormalizados se logra una aproximación más suave a 0. float Números desnormalizados 0 Franco Guidi Polanco (PUCV-EII) Expresiones binarias o unarias en las que participa un double, generan como resultado un double. Expresiones binarias o unarias en las que participa un float, pero no un double, generan como resultado un float. Al sumar 1 al máximo float (Float.MAX_VALUE) se obtiene como resultado +Infinity (Float.POSITIVE_INFINITY), no un double. Números normalizados 1.2E-38 3.4E38 14/03/2007 53 Operaciones en punto flotante 14/03/2007 54 +0 =-0 NaN operado con cualquier otro valor genera NaN Cualquier división de ±0 por ±0 genera NaN La suma o resta de ±Infininity con otros números genera ±Infininity La suma de +Infinity con –Infinity genera NaN El producto de ± Infininity con ±0 genera NaN ...y otras Un valor normalizado, o Un valor desnormalizado, o El valor +0 o -0 El valor +Infinity o –Infinity, o El valor NaN (Not-a-Number) Franco Guidi Polanco (PUCV-EII) 14/03/2007 Características de los valores especiales Al operar dos valores punto flotante el resultado será del tipo correspondiente, y que contendrá: Franco Guidi Polanco (PUCV-EII) 55 Franco Guidi Polanco (PUCV-EII) 14/03/2007 56 IEEE 754 y sus Excepciones Excepciones de IEEE 754 v/s Java IEEE 754 define 5 tipos de excepciones: Invalid Operation Genera como resultado Not-a-Number División por cero Genera como resultado ±oo Overflow Asigna como resultado el mayor número normalizado posible o ±oo Underflow Asigna como resultado ± 0, el número normalizado más próximo a 0, o un número desnormalizado Valor inexacto Asigna como resultado el valor redondeado más próximo posible Java no adhiere al estándar en materia de notificación de excepciones (es decir... no las notifica). Los programas deben chequear las excepciones, preguntando si se han generado resultados Not-a-Number (NaN), +Infinity o –Infinity (ej. usar Float.isNaN() o Double.isNaN() ) Cuando ocurre una excepción, el computador debe advertir este hecho, setendo el status de una variable indicadora. El status no se modificará hasta que el programa haga el reset de esta variable. Franco Guidi Polanco (PUCV-EII) 14/03/2007 57 Franco Guidi Polanco (PUCV-EII) Conversión por ampliación de float a double Notar que 1/3f: s=0 E = -2 mantisa = 1.01010101010101010101011 a = 1/3f El valor impreso de a es 0.33333334 ¿Qué ocurre si el valor de la variable a se asigna la variable b de tipo double? ¿...? El valor impreso de b es 0.3333333432674408 ¿Por qué no es 0.333333340000000? Y además que al hacer la asignación del valor float a la variable double: s=0 E = -2 mantisa = 1.0101010101010101010101100000000000000000000000000000 Pero si hubiésemos hecho 1.0/3: ¿¿¿Basura aleatoria??? Notar además que 1.0/3 = 0.333333333333333 (double) 14/03/2007 58 Conversión por ampliación de float a double Supongamos la variable a de tipo float: Franco Guidi Polanco (PUCV-EII) 14/03/2007 59 s=0 E = -2 mantisa = 1.0101010101010101010101010101010101010101010101010101 Valor en base 10= 0.333333333333333 Franco Guidi Polanco (PUCV-EII) 14/03/2007 60 Aproximación El Épsilon (ε) de la Máquina Considerar por ejemplo que 1/3f no es representable exactamente como punto flotante: El épsilon de la máquina es el mayor valor positivo que al sumarlo a 1, produce un resultado igual a 1. En otras palabras, buscamos ε tal que por redondeo: 1/3f 1+ε=1 1.01010101010101010101010 Todo ε mayor producirá: 1+ε>1 En el caso de datos float: 1.01010101010101010101011 Java utiliza la aproximación al más cercano (round to nearest): Cuando un valor exacto se encuentra entre dos valores representables, se toma el valor punto flotante más próximo al valor exacto. Si el valor exacto se encuentra exactamente a la misma distancia de dos valores representables, se toma el valor punto flotante cuyo bit menos significativo (de la derecha) sea 0. Franco Guidi Polanco (PUCV-EII) 14/03/2007 + 1.00000000000000000000000 61 Tarea Franco Guidi Polanco (PUCV-EII) 14/03/2007 62 Caso de estudio: el sistema de misiles Patriot Patriot: Sistema defensivo anti-misiles de EE.UU. Estudiar las clases BigInteger y BigDecimal de Java, pertenecientes al package java.math. Franco Guidi Polanco (PUCV-EII) 1.00000000000000000000000 0.000000000000000000000001 14/03/2007 En la batalla del Golfo Pérsico, el 25 de febrero de 1991, uno de estos sistemas falló en la interceptación de un misil Iraquí Scud. El misil Scud dio muerte a 28 soldados que permanecían en una barraca e hirió a otras 100 personas, en la ciudad de Dharhan, Arabia Saudita. 63 Franco Guidi Polanco (PUCV-EII) 14/03/2007 64 Caso de estudio: el sistema de misiles Patriot Caso de estudio: el sistema de misiles Patriot La investigación de los hechos estableció que: El valor 1/10 no tiene representación exacta en base 2, y el sistema lo trunca a 24 bits. El radar del sistema Patriot identificó correctamente al misil enemigo, sin embargo, luego de su detección lo consideró una falsa señal y lo descartó como objetivo. El sistema consideró al misil como falsa señal porque, tras predecir correctamente su trayectoria, en la siguiente observación inspeccionó un área del cielo equivocada. El pequeño error de exactitud se vuelve significativo cuando se lo multiplica por cantidades grandes (por ej. a las 100 horas de operación del sistema): El error en de zona de inspección se debió a inexactitudes en el control del tiempo en el sistema Patriot: el sistema maneja intervalos de 1/10 de segundo, los cuales son contados y almacenados en una variable entera. Por su parte, el valor correspondiente a 1/10 de segundo es almacenado en una variable de punto fijo de 24 bits. El tiempo actual es calculado como el producto de ambos valores. Al momento de la falla, el sistema se encontraba en torno a las 100 horas de operación continua. Franco Guidi Polanco (PUCV-EII) 14/03/2007 Valor 1/10 = 1/24 + 1/25 + 1/28 + 1/29 + 1/212 + … 1/10 en base 2 = 0.0001100110011001100110011001100...2 Registro del Patriot = 0.000110011001100110011002 Error en el registro = 0.0000000000000000000000011001100…2 Error en el registro = 0.00000009510 (aprox.) Error en 100 horas de operación= 0.000000095×100×60×60×10=0.34 seg Un misil Scud viaja a 1.676 m/seg, en 34 s recorre aprox. 570 m. Por lo anterior, el sistema no encontró al objetivo en lugar esperado. 65 Franco Guidi Polanco (PUCV-EII) 14/03/2007 66 Para saber más sobre tramiento computacional de números Caso de estudio: el sistema de misiles Patriot El problema había sido identificado por investigadores israelitas y comunicado al ejército de EE.UU. La solución provisoria consistía en resetear los sistemas cada cierto tiempo, sin embargo esto no fue correctamente aplicado por los operadores del ejército. Mack Ronald. “Java Number Cruncher. The Java Programmer’s Guide To Numerical Computing” PrenticeHall PTR, Upper Saddle River, New Jersey, 2003. El patch para el software estuvo disponible al día siguiente de la tragedia. Franco Guidi Polanco (PUCV-EII) 14/03/2007 67 Franco Guidi Polanco (PUCV-EII) 14/03/2007 68