Download Java-Tipos de datos numericos - Escuela de Ingeniería Industrial

Document related concepts

Precisión simple en coma flotante wikipedia , lookup

IEEE coma flotante wikipedia , lookup

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
[email protected]
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