Está en la página 1de 17

Errorres

“Nuestras bombas
inteligentes cometen
errores no mayores a los
Representación computacional de tipos de 5 cm.”
(Guerra de Irak)
datos numéricos

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: definiciones Errores: Roundoff

™ Error absoluto: ™Es la diferencia entre un valor exacto y el valor


| (valor obtenido) – (valor correcto) | mediante el cual se lo puede representar.
™Ejemplo: si utilizamos el tipo de dato float:
™ Error relativo:
(error absoluto) 1/2 0,5
(valor correcto) 1/3 0,33333334
1/4 0,25
™ Porcentaje de error: 1/5 0,2
(error relativo) * 100 [%] 1/6 0,16666667
1/7 0,14285715

Franco Guidi Polanco (PUCV-EII) 14/03/2007 3 Franco Guidi Polanco (PUCV-EII) 14/03/2007 4
Errores: Cancelación Números decimales

™ Occurre cuando la mayoría de los dígitos significativos se pierde ™ Los números decimales nos permiten representar fracciones.
durante la sustracción de dos números muy similares.
™ Algunas fracciones tienen representación exacta como
™ Por ejemplo, teóricamente:
numero decimal (en base 10): en su expresión simplificada,
1 sus denominadores dividen en forma exacta alguna potencia
= 20.000.000 de 10.
10.000.001 1
-
20.000.000 2 ™ Ejemplos:
Debe ser: 0,50000005
Fracción Número decimal Potencia de 10
™ Pero si las operaciones se realizan con datos float: 1/2 0,5 10 (10/2=5)
1
=
1
= 1,6777216E-8
1/4 0,25 102 (100/4=25)
0,50000006 - 0,5 5,960464E-8 1/5 0,2 10 (10/5=2)
Porcentaje error: 16,11% 1/8 0,125 103 (1000/8=125)

Franco Guidi Polanco (PUCV-EII) 14/03/2007 5 Franco Guidi Polanco (PUCV-EII) 14/03/2007 6

Representación inexacta de fracciones reales Representación de fracciones en computadores

™ Las fracciones simplificadas cuyos denominadores no ™ La Java Virtual Machine representa los valores numéricos
dividen en forma exacta alguna potencia de 10, no tienen en base 2.
representación exacta como número decimal (en base 10). ™ Las variables numéricas para almacenar valores en punto
™ Ejemplos: flotante son de capacidad limitada.
™ Por lo tanto pueden ser representadas exactamente
Fracción Número decimal aquellas fracciones (simplificadas) cuyo denominador divida
exactamente una potencia de 2, y cuya cantidad de
1/3 0,3333... (0,3)
decimales no exceda la capacidad del tipo.
1/6 0,1666... (0,16) ™ Ejemplos:
1/7 0,142857142857.... (0,142857) ƒ 1/2
ƒ 1/4
1/9 0,1111... (0,1)
ƒ 1/5

Franco Guidi Polanco (PUCV-EII) 14/03/2007 7 Franco Guidi Polanco (PUCV-EII) 14/03/2007 8
Matemática “pura” v/s matemática
Precisión y exactitud
“computacional”
Para los valores en punto flotante se define: Los números reales: Los números en punto
flotante:
™ Precisión: representa la cantidad de dígitos significativos ™ Son infinitos (no hay
que tiene su mantisa (“significand”). En Java los valores primero ni último) ™ Son acotados
double son más precisos que los float.
™ Son contínuos (entre dos
™ Exactitud: representa qué tan próximo se encuentra un números reales existe
valor en punto flotante, respecto de su valor correcto. ™ Son discretos
siempre otro número real)
Valor real
™ Tienen precisión infinita
1/3 0,3333333f Más exacto
(tienen la cantidad de ™ Tienen precisión limitada
1/3 0,344444444444444 (double) Más preciso decimales que sean
necesarios)

Franco Guidi Polanco (PUCV-EII) 14/03/2007 9 Franco Guidi Polanco (PUCV-EII) 14/03/2007 10

Tipos de datos enteros en Java

™Java ofrece los siguientes tipos de datos enteros:

Tipo Tamaño Valor mínimo Valor máximo


(Bits)
Valores Enteros 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 65.535

Franco Guidi Polanco (PUCV-EII) 14/03/2007 12


Representación interna (positivos) Operaciones en Java

™Para el tipo byte: ™Recordar que:


ƒ Operaciones de dos variables byte o short generan un
0 0 0 0 0 0 0 0 02 = 0 * 20 = 010 resultado int.
0 0 0 0 0 0 0 1 12 = 1 * 20 = 110 ƒ Operaciones de dos valores int generan como resultado
un int.
0 0 0 0 0 0 1 0 102 = 1*21 + 0*20 = 210
ƒ Operaciones que involucran al menos un long generan
0 0 0 0 0 0 1 1 112 = 1*21 + 1*20 = 310 como resultado un long.
0 0 0 0 0 1 0 0 1002 = 1*22 + 0*21 +0*20 = 410

0 1 1 1 1 1 1 1 1111112 = 1*26 + 1*25 +


1*24 + 1*23 +
26 25 24 23 22 21 20 1*22 + 1*21 +1*20 = 12710

Franco Guidi Polanco (PUCV-EII) 14/03/2007 13 Franco Guidi Polanco (PUCV-EII) 14/03/2007 14

Representación de números negativos: “signed


Representación de números negativos
magnitude”
™ Supongamos la existencia de un tipo de dato entero ™ Signed magnitude (magnitud con signo) es una forma de
llamado “by” (la mitad de un byte), que almacena números codificar los número negativos :
enteros de 4 bits. ƒ Números positivos: bit de signo igual a 0
™ Utilizaremos 3 bits para representar la parte numérica y ƒ Números negativos: bit de signo igual 1
uno (el primero de la izquierda) para el signo: ™ Ejemplo:
0 0000 -0 1000
1 0001 -1 1001
¿Inconvenientes?
2 0010 -2 1010
3 0011 -3 1011
4 0100 -4 1100
5 0101 -5 1101
6 0110 -6 1110
7 0111 -7 1111

Franco Guidi Polanco (PUCV-EII) 14/03/2007 15 Franco Guidi Polanco (PUCV-EII) 14/03/2007 16
Representación de números negativos: “two’s-
Problemas al utilizar signed magnitude
complement”
™Dos características indeseables: ™ Two’s-complement (complemento de dos) codifica los
ƒ Existen dos ceros, uno positivo y otro negativo números negativos de la siguiente forma:
ƒ Los números positivos se representan “normalmente”
0000 +0 ƒ Los números negativos se representan complementando cada bit
del número positivo correspondiente, y luego sumando 1 al
1000 -0 resultado
ƒ En cualquier caso, el bit de la izquierda representa el signo (0:
ƒ No se puede utilizar la lógica normal de suma de positivo, 1: negativo)
enteros:
™ Ejemplo: representación del número -6
6 + -3 =3 -3 + -2 =-5
Número positivo correspondiente (6) 0110
0110 6 1011 -3
Complementar cada bit 1001

x x
+ 1011 -3 + 1010 -2
Sumar 1 1
0001 1 0101 5 Valor 6 negativo (-6) 1011

Franco Guidi Polanco (PUCV-EII) 14/03/2007 17 Franco Guidi Polanco (PUCV-EII) 14/03/2007 18

Representación de números negativos: “two’s- Representación de números negativos: “two’s-


complement” complement”
™Entonces los “by” serán los siguientes: ™Operaciones de suma:

-1 1111 0 0000 6 + -3 =3 -3 + -2 =-5


-2 1110 1 0001
-3 1101 2 0010
-4 1100 3 0011
0110 6 1011 -3
-5 1011 4 0100
+ 1101 -3 + 1110 -2
-6 1010 5 0101
-7 1001 6 0110
0011 3 1001 -5

-8 1000 7 0111

Franco Guidi Polanco (PUCV-EII) 14/03/2007 19 Franco Guidi Polanco (PUCV-EII) 14/03/2007 20
Java y representación de enteros El conjunto de los números enteros

™En Java se representan utilizando “two’s- ™ En los números enteros:


complement” los siguientes tipos enteros:
ƒ short
-8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8
ƒ byte
ƒ int ™ El conjunto de los enteros es “cerrado” respecto de la
ƒ long adición y sustracción (…¡y éstas no fallan!)

™El tipo char no tiene bit de signo, todos sus bits 2+4=6
representan 0 ó un número positivo. -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8

4 - 6 = -2
-8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8

Franco Guidi Polanco (PUCV-EII) 14/03/2007 21 Franco Guidi Polanco (PUCV-EII) 14/03/2007 22

Los números enteros en Java… Los números enteros en Java…

™Podemos imaginar los “by” ordenados en círculo: ™Ejemplo de suma: 2 + 3 = 5

0000 0000
1111 0001 1111 0001
1110 0 0010 1110 0 0010
-1 1 -1 1
-2 2 0011 -2 2 0011
1101 1101
-3 3 -3 3
1100 -4 4 0100 1100 -4 4 0100

-5 5 -5 5
1011 0101 1011 0101
-6 6 -6 6
-7 7 -7 7
-8 0110 -8 0110
1010 1010
1001 0111 1001 0111
1000 1000

Franco Guidi Polanco (PUCV-EII) 14/03/2007 23 Franco Guidi Polanco (PUCV-EII) 14/03/2007 24
Los números enteros en Java… Los números enteros en Java…

™Ejemplo de suma: 6 + 2 = -8 …¿? ™Una resta: -6 – 4 = 6 … ¡!


0000 0000
1111 0001 1111 0001
1110 0 0010 1110 0 0010
-1 1 -1 1
-2 2 0011 -2 2 0011
1101 1101
-3 3 -3 3
1100 -4 4 0100 1100 -4 4 0100

-5 5 -5 5
1011 0101 1011 0101
-6 6 -6 6
-7 7 -7 7
-8 0110 -8 0110
1010 1010
1001 0111 1001 0111
1000 1000

Overflow!
Franco Guidi Polanco (PUCV-EII) 14/03/2007 25 Franco Guidi Polanco (PUCV-EII) 14/03/2007 26

Los números enteros en Java… Los números enteros en Java…

™ La aritmética de enteros no
™ Entonces… mis
genera tipo de aviso alguno
(mensaje de error, excepción, programas
etc.) cuando las operaciones anteriores…
de enteros producen ¿funcionaban
resultados “incorrectos” (no correctamente?
hay excepciones de overflow).

™ Pensar en los ciclos iterativos


que incrementan contadores, “Overflows can
en simples operaciones de be silent killers
aritméticas que pasan por of integer
valores positivos y
negativos… sin control arithmetic!”
alguno… etc. - Ronald Mak

Franco Guidi Polanco (PUCV-EII) 14/03/2007 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
Ejemplo:
ƒ Short
ƒ Integer Integer num = new Integer( 140 );
Valores en punto flotante
ƒ Long

™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

™ Supongamos la existencia de un formato punto flotante ™La distribución de los anteriores en la recta
que tiene una mantisa (f) de 1 dígito, y un exponente (e) numérica sería:
de 1 dígito, todos en base 10:
e=-1
f e = -1 e=0 e=1
0 0* 10-1 = 0 0* 100 =0 0 * 101 = 0
1 1* 10-1 = 0,1 1* 100 =1 1 * 101 = 10 0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8 0,9 1
2 2 * 10-1 = 0,2 2 * 100 = 2 2 * 101 = 20 e=0
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 5* 10-1 = 0,5 5* 100 =5 5 * 101 = 50
0 0,5 1 2 3 4 5 6 7 8 9 10
6 6* 10-1 = 0,6 6* 100 =6 6 * 101 = 60
e=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
9 9* 10-1 = 0,9 9* 100 =9 9 * 101 = 90
01 5 10 20 30 40 90
Franco Guidi Polanco (PUCV-EII) 14/03/2007 31 Franco Guidi Polanco (PUCV-EII) 14/03/2007 32
Los números son representados en forma binaria Conceptos revisitados

™Considerar significante de de 2 bits y exponente ™Error de redondeo (roundoff): diferencia entre un


de 2 bits valor exacto y el valor que lo puede representar.
f e = -11 e = -10 e = -01 e = 00 e=01 e=10 e=11
1.00 0.001002= 0.01002= 0.1002= 1.002= 10.02= 1002= 1000= ™Precisión (precision): es la medida del número de
0.12510 0.2510 0.510 1.0010 210 410 810
dígitos significativos de la mantisa de un valor en
1.01 0.001012= 0.01012= 0.1012= 1.012= 10.12= 1012= 10102=
0.1562510 0.312510 0.62510 1.2510 2.510 510 1010 punto flotante.
1.10 0.001102= 0.01102= 0.1102= 1.102= 11.02= 1102= 11002=
0.187510 0.37510 0.7510 1.510 310 610 1210
1.11 0.001112= 0.01112= 0.1112= 1.112= 11.12= 1112= 11102= ™Exactitud (accuracy): representa qué tan “correcto”
0.2187510 0.437510 1.7510
0.87510 3.510 710 1410
es un valor en punto flotante, esto es, qué tan
cercano a su valor exacto.

Franco Guidi Polanco (PUCV-EII) 14/03/2007 33 Franco Guidi Polanco (PUCV-EII) 14/03/2007 34

Las Leyes del Algebra: Propiedad Asociativa


Las Leyes del Algebra: Propiedad Asociativa
(cont.)
™ El álgebra de los números reales cumple la propiedad Ejemplo:
asociativa de la suma y la multiplicación:
™ Sea a = 1.0f (1.00000000)
b = 3.0E-8f (0.00000003)
(a + b) + c = a + (b + c)
c = 4.0E-8f (0.00000004)
(ab)c = a(bc)
?
(a + b) + c = a + (b + c)
™ La aritmética de punto flotante en Java no cumple con ? 1.0 + (3.0E-8 + 4.0E-8)
tales propiedades (ver ejemplo en siguiente transparencia). (1.0 + 3.0E-8) + 4.0E-8 =
1.00000003
(roundoff) ?
1.0 + 4.0E-8 = 1.0 + 7.0E-8
(roundoff) (roundoff)
1.0 = 1.0000001

Franco Guidi Polanco (PUCV-EII) 14/03/2007 35 Franco Guidi Polanco (PUCV-EII) 14/03/2007 36
Las Leyes del Algebra: Propiedad Asociativa
Propiedad Asociativa: ¿Porcentaje de fallas?
(cont.)
Ejemplo: ™Ronald Mak1 muestra un simple experimento en el
™ Sea a = 0.5f cual se prueba la propiedad asociativa de la suma
b = 1.0E-45f y multiplicación de tres números float2:
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 1.4E-45 * 3.0E38 1 Java Number Cruncher. The Java Programmer’s Guide To
(underflow) ? Numerical Computing
0.0 * 3.0E-38 = 0.5 * 4.2038954E-7 2 Números float generados al azar, 1.000.000 de pruebas

0.0 = 2.1019477E-7

Franco Guidi Polanco (PUCV-EII) 14/03/2007 37 Franco Guidi Polanco (PUCV-EII) 14/03/2007 38

Las Leyes del Algebra: Propiedad Distributiva e


Las Leyes del Algebra: Propiedad Conmutativa
Inverso Multiplicativo
™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 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 ™Especifica:


punto flotante implementados en hardware y ƒ formatos numéricos
software ƒ operaciones
ƒ conversiones
™Resultados de operaciones variaban al cambiar de ƒ excepciones
plataforma
™Java adhiere al estándar:
™En 1985 se estableció el estándar IEEE 754, al cual
ƒ tipo float: formato 32 bit de precisión simple
hoy adhieren muchos sistemas.
ƒ 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 Franco Guidi Polanco (PUCV-EII) 14/03/2007 42

IEEE 754: Formato Numérico IEEE 754: Formato Numérico (cont.)

™Cada número se divide en tres partes: ™ Bit de signo: 0 (positivo) y 1 (negativo)

ƒ Bit de signo (s) ™ Exponente:


ƒ Exponente (e) ƒ No tiene signo (siempre positivo)
ƒ En float toma valores entre 0 y 255 (pero ambos son reservados)
ƒ Fracción (f)
ƒ En double toma valores entre 0 y 2047 (pero ambos son
s e f reservados)
1 8 23 ƒ El valor almacenado es sesgado
ƒ El valor auténtico, insesgado, (E) se obtiene restando el “sesgo” al
valor sesgado:
32 bit Ejemplo (float):
• Sesgo formato float: 127
s e f • Sesgo formato double: 1023 e = 315
E = 315 – 127 = 188
1 11 52
e = 25
64 bit
E = 25 – 127 = -102

Franco Guidi Polanco (PUCV-EII) 14/03/2007 43 Franco Guidi Polanco (PUCV-EII) 14/03/2007 44
IEEE 754 Formato Numérico: exponente IEEE 754 Números Normalizados

™Tabla de valores posibles del exponente: s e f


1 8 23 (float)

32 bit
Valor Valores Valores Sesgo Valores
sesgado reservados admisibles (admisibles)
sesgados sesgados insesgados
™ Si el exponente no es valor reservado (0 ó 255 para float, 0
float 0 .. +255 0 y +255 +1 .. 254 +127 -126 .. +127
ó 2047 para double), el número se interpreta de la
siguiente forma:
ƒ El bit de signo determina el signo del número (1: negativo, 0:
double 0.. +2047 0 y +2047 +1 .. +2046 +1023 -1022 .. +1023
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).

Franco Guidi Polanco (PUCV-EII) 14/03/2007 45 Franco Guidi Polanco (PUCV-EII) 14/03/2007 46

IEEE 754 Números Normalizados IEEE 754 Números Normalizados

™Ejemplo: ™Ejemplo: el menor float positivo


ƒ s=0 ƒ s=0
ƒ e = 011111012 = 12510 ƒ e = 000000012 = 110
ƒ f =100000000000000000000002 ƒ f =000000000000000000000002

Entonces: Entonces:
ƒ E = 12510 –12710 = -210 ƒ E = 110 – 12710 = -12610
ƒ Significante = 1.100000000000000000000002 ƒ Significante = 1.000000000000000000000002
ƒ Número = 0.0112 ƒ Número = 0 * 2-1 + 0 * 2-2 + ... + 0 * 2-125 + 1 * 2-126
ƒ Número = 0 * 20 + 0 * 2-1 + 1 * 2-2 + 1 * 2-3 ƒ = (aprox) 1.1755E-38
ƒ = 0 + 0 + 1/4 + 1/8 = 0.25 + 0.125 = 0.375

Franco Guidi Polanco (PUCV-EII) 14/03/2007 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
ƒ s=0 float es aprox. 1.1755E-38
ƒ e = 111111102 = 25410
ƒ f =111111111111111111111112 ™Luego, el número inmediatamente anterior es 0
Entonces:
ƒ E = 25410 – 12710 = 12710 ™Los números desnormalizados explotan los valores
ƒ Mantisa = 1.111111111111111111111112 reservados del exponente para generar nuevos
ƒ Número = aprox. 3.4E38 rangos de valores.

Franco Guidi Polanco (PUCV-EII) 14/03/2007 49 Franco Guidi Polanco (PUCV-EII) 14/03/2007 50

Java y los Números Desnormalizados Java y los Números Desnormalizados

™Número desnormalizado (o subnormal): ™ El número desnormalizado positivo más pequeño tipo float
ƒ e = 0 (valor reservado), y es:
ƒ s=1
ƒ f != 0
ƒ e=0
Se interpreta: ƒ f =000000000000000000000012
ƒ Se asumen un 0 y un punto decimal implícitos delante ƒ mantisa = 0.000000000000000000000012
del primer bit de la fracción: 0.f ƒ Número = 2-149 = aprox = 1.4E-45
ƒ En el caso de un float, se mueve el punto decimal ™ El número desnormalizado positivo más grande tipo float
implícito 126 posiciones a la izquierda es:
ƒ En el caso de un double, se mueve el punto decimal ƒ s=1
implícito 1022 posiciones a la izquierda ƒ e=0
ƒ f =111111111111111111111112
ƒ El valor del bit de signo determina el signo del numero
ƒ mantisa = 0.111111111111111111111112
(0: positivo, 1: negativo)
ƒ Número = aprox 1.2E-38

Franco Guidi Polanco (PUCV-EII) 14/03/2007 51 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 ™ Expresiones binarias o unarias en las que participa un
una aproximación más suave a 0. 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.
Números Números ™ Al sumar 1 al máximo float (Float.MAX_VALUE) se obtiene
desnormalizados normalizados como resultado +Infinity (Float.POSITIVE_INFINITY), no
float
un double.

0 1.2E-38 3.4E38

Franco Guidi Polanco (PUCV-EII) 14/03/2007 53 Franco Guidi Polanco (PUCV-EII) 14/03/2007 54

Operaciones en punto flotante Características de los valores especiales

™Al operar dos valores punto flotante el resultado ™+0 =-0


será del tipo correspondiente, y que contendrá: ™NaN operado con cualquier otro valor genera NaN
ƒ Un valor normalizado, o ™Cualquier división de ±0 por ±0 genera NaN
ƒ Un valor desnormalizado, o
™La suma o resta de ±Infininity con otros números
ƒ El valor +0 o -0
genera ±Infininity
ƒ El valor +Infinity o –Infinity, o
ƒ El valor NaN (Not-a-Number) ™La suma de +Infinity con –Infinity genera NaN
™El producto de ± Infininity con ±0 genera NaN
™...y otras

Franco Guidi Polanco (PUCV-EII) 14/03/2007 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: ™ Java no adhiere al estándar en materia de notificación de
Invalid Operation Genera como resultado Not-a-Number excepciones (es decir... no las notifica).
™ Los programas deben chequear las excepciones,
División por cero Genera como resultado ±oo preguntando si se han generado resultados Not-a-Number
(NaN), +Infinity o –Infinity (ej. usar Float.isNaN() o
Overflow Asigna como resultado el mayor número normalizado
posible o ±oo Double.isNaN() )
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
™ 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) 14/03/2007 58

Conversión por ampliación de float a double Conversión por ampliación de float a double

™Supongamos la variable a de tipo float: ™ Notar que 1/3f:


ƒ s=0
ƒ a = 1/3f
ƒ E = -2
ƒ El valor impreso de a es 0.33333334 ƒ mantisa = 1.01010101010101010101011
ƒ ¿Qué ocurre si el valor de la variable a se asigna la ™ Y además que al hacer la asignación del valor float a la variable double:
variable b de tipo double? ƒ s=0
ƒ ¿...? ƒ E = -2
ƒ El valor impreso de b es 0.3333333432674408 ƒ mantisa = 1.0101010101010101010101100000000000000000000000000000
ƒ ¿Por qué no es 0.333333340000000? ™ Pero si hubiésemos hecho 1.0/3:
ƒ s=0

¿¿¿Basura aleatoria??? ƒ
ƒ
E = -2
mantisa = 1.0101010101010101010101010101010101010101010101010101
ƒ Valor en base 10= 0.333333333333333
ƒ Notar además que 1.0/3 = 0.333333333333333
(double)

Franco Guidi Polanco (PUCV-EII) 14/03/2007 59 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 ™ El épsilon de la máquina es el mayor valor positivo que al
exactamente como punto flotante: sumarlo a 1, produce un resultado igual a 1.
1/3f ™ En otras palabras, buscamos ε tal que por redondeo:
1+ε=1
™ Todo ε mayor producirá:
1.01010101010101010101010 1.01010101010101010101011
1+ε>1
™ Java utiliza la aproximación al más cercano (round to ™ En el caso de datos float:
nearest):
ƒ Cuando un valor exacto se encuentra entre dos valores 1.00000000000000000000000
representables, se toma el valor punto flotante más próximo al + 0.000000000000000000000001
valor exacto. 1.00000000000000000000000
ƒ 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 61 Franco Guidi Polanco (PUCV-EII) 14/03/2007 62

Tarea Caso de estudio: el sistema de misiles Patriot

™Estudiar las clases BigInteger y BigDecimal de ™ Patriot: Sistema defensivo anti-misiles de EE.UU.
Java, pertenecientes al package java.math. ™ 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.

Franco Guidi Polanco (PUCV-EII) 14/03/2007 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, ƒ Valor 1/10 = 1/24 + 1/25 + 1/28 + 1/29 + 1/212 + …
sin embargo, luego de su detección lo consideró una falsa señal y lo ƒ 1/10 en base 2 = 0.0001100110011001100110011001100...2
descartó como objetivo. ƒ Registro del Patriot = 0.000110011001100110011002
ƒ Error en el registro = 0.0000000000000000000000011001100…2
™ El sistema consideró al misil como falsa señal porque, tras predecir ƒ Error en el registro = 0.00000009510 (aprox.)
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
™ 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 horas de operación del sistema):
de segundo, los cuales son contados y almacenados en una variable
ƒ Error en 100 horas de operación= 0.000000095×100×60×60×10=0.34 seg
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 ™ Un misil Scud viaja a 1.676 m/seg, en 34 s recorre aprox. 570 m. Por lo
es calculado como el producto de ambos valores. Al momento de la anterior, el sistema no encontró al objetivo en lugar esperado.
falla, el sistema se encontraba en torno a las 100 horas de operación
continua.

Franco Guidi Polanco (PUCV-EII) 14/03/2007 65 Franco Guidi Polanco (PUCV-EII) 14/03/2007 66

Para saber más sobre tramiento computacional de


Caso de estudio: el sistema de misiles Patriot
números
™ El problema había sido identificado por investigadores ™ Mack Ronald. “Java Number Cruncher. The Java
israelitas y comunicado al ejército de EE.UU. Programmer’s Guide To Numerical Computing” Prentice-
Hall PTR, Upper Saddle River, New Jersey, 2003.
™ 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.

™ 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