Arquitecturas de Computadoras Capitulo 2 Aritmética de Punto Flotante
Aritmética de Punto Flotante Acertijos de operaciones con punto flotante Para cada una de las siguientes expresiones en C: Discuta si es verdad para todos los valores de los argumentos Explique por qué no es verdad ¡Asuma que ni d o f son NaN! x == (int)(float) x x == (int)(double) x f == (float)(double) f d == (float) d f == -(-f); 2/3 == 2/3.0 d < 0.0 ((d*2) < 0.0) d > f -f > -d d * d >= 0.0 (d+f)-d == f int x = …; float f = …; double d = …;
Cita del día “95% of the folks out there are completely clueless about floating-point.” James Gosling Sun Fellow Java Inventor
Punto Flotante IEEE Estándar IEEE 754 Establecido en 1985 como un estándar uniforme para aritmética de punto flotante había diferentes formatos (código incompatible) Es soportado por todos los CPU’s grandes Maneja diferentes aspectos numéricos Establece un estándar para realizar redondeo, desbordamiento y subdesbordamiento Es difícil de que a nivel hardware se realice el procesamiento más rápido
Creador del estándar IEEE Standard 754 for Binary Floating-Point Arithmetic. …/ieee754status/754story.html Prof. Kahan 1989 ACM Turing Award Winner! de punto flotante
Representación de fracciones Representación Los bits a la derecha del “punto binario” representan fracciones de potencia a la -2 Se representa el número racional de la sumatoria (arriba) bibi b i–1 b2b2 b1b1 b0b0 b –1 b –2 b –3 b–jb–j i–1 2i2i 1/2 1/4 1/8 2–j2–j
Ejemplos de fracciones ValorRepresentación 5-3/ / / Observaciones Se puede dividir entre 2 con corrimiento a la derecha Se puede multiplicar por 2 con corrimiento a l izquierda Números de la forma … 2, es decir menores a 1.0 se pueden representar como: 1/2 + 1/4 + 1/8 + … + 1/2 i + … 1.0 Se recomienda utilizar la notación científica
Números representables Limitaciones Se pueden representar números solo de la forma x/2 k Algunos números tienen una representación repetida de bits ValorRepresentación 1/ [01]… 2 1/ [0011]… 2 1/ [0011]… 2
Representación de números Forma numérica -1 s M 2 E El bit de signo s determina si el número es positivo o negativo La fracción o mantisa M representa el valor de una fracción en el rango [1.0, 2.0) El exponente E pondera el valor por uno o por dos. Codificación El bit de signo s es el bit más significativo El campo exp codifica E El campo frac codifica M sexpfrac Punto Flotante
Punto flotante Codificación El bit de signo es el bit más significativo El campo exp codifica E El campo frac codifica M Tamaños Precisión sencilla: se utilizan 8 bits para exp y 23 bits para frac Se tiene un total de 32 bits Doble precisión: se utilizan 11 bits para exp y 52 bits para frac Se tiene un total de 64 bits Precisión extendida: se utilizan 15 bits para exp y 63 bits para frac Se tiene un total de 80 bits (sólo lo utilizan CPU’s de Intel y se desperdicia 1 bit) sexpfrac Precisión
Numeros normalizados Condición exp 000…0 y exp 111…1 El exponente se codifica como un número polarizado E = Exp – Polarización Exp: valor sin signo que se denoa por exp Polarización: Valor que polariza Precisión sencilla: 127 (Exp: 1…254, E: -126…127) Doble precisión: 1023 (Exp: 1…2046, E: -1022…1023) En general: Polarización = 2 e-1, donde e es el número de bits del exponente. Codificación significativa con el valor de 1 implícito M = 1.xxx…x 2 Es mínimo cuando 000…0 (M = 1.0) Es máximo cuando 111…1 (M = ) Se tiene un bit más significativo extra que está “libre”
Ejemplos Valor float F = ; = = X 2 13 Significado M = frac= Exponente E = 13 Polarización = 127 Exp = 140 = Representación de punto flotante: Hex: D B Binario: Exponente:140 : Codificación normalizada
Numeros des-normalizados Condición exp = 000…0 Valor Valor exponencial E = -Polarización+1 Valor mantiza M = 0.xxx…x 2 xxx…x: bits de frac Casos exp = 000…0, fracción = 000…0 Representa el valor 0 Hay que notar que puede tener valores distintos +0 y -0 exp = 000…0, fracc 000…0 Número muy cercanos a 0.0 Se pierde precisión al ser un número más pequeño “Se llega a un subdesbordamiento”
Numeros especiales Condición Exp = 111…1 Casos Exp = 111…1, frac = 000…0 Representa un valor (infinito) Estas operaciones causan sobreflujo Ambos valores pueden ser números positivos y negativos E.g. 1.0/0.0 = -1.0/0.0 = + , 1.0/-0.0 = - Exp = 111…1, frac 000…0 Not-a-Number (NaN) Representan casos cuando valores numéricos pueden ser indeterminados por ejemplo sqrt(-1), -
Resumen de Codificación NaN ++ 00 +Desnorm+Normalizado -Desnorm -Normalizado +0 Numeros de punto flotante
Formato pequeño Representación de punto flotante con 8 bits El bit de signo es el bit más significativo Los siguientes 4 bits son para el exponente, con un valor de polarización de 7 Los últimos 3 bits representan la fracción Es lo mismo que el formato general IEEE Normalizado y desnormalizado Se representan el 0, NaN e infinito sexpfrac de punto flotante
Valores des-normalizados Exp d Exp b E2 E /64 (Des-normalizado, E = 0 y Frac != 0) / / / / / / (Normalizado, E != 0 y Frac != 0) n/a (inf, NaN) (Exp = 1111, Frac != 0) relacionados al exponente sExpFrac
Rango dinámico S Exp Frac EValor /8*1/2 6 = 1/ /4*1/64= 2/512 … /8*1/64= 6/ /8*1/64= 7/ /8*1/64= 8/ /8*1/64= 9/512 … /8*1/2= 14/ /8*1/2= 15/ /8*1= /8*1= 9/ /8*1= 10/8 … /8*128= /8*128= n/ainf Cercano a cero El mayor desnorm. El mas pequeño norm. Por abajo de 1 Por arriba de 1 El mayor norm. Numeros De-normalizados Numeros Normalizados W=8 bits
Distribución de valores ( 6 bits) Punto flotante de 6 bits, igual que el formato IEEE e = 3 bits del exponente f = 2 bits de la fracción Polarización igual a 3 Hay que notar que la distribución se vuelve más densa conforme se aproxima al cero DesnormalizadoNormalizadoInfinito
(un acercamiento) Punto flotante de 6 bits, igual que el formato IEEE e = 3 bits del exponente f = 2 bits de la fracción Polarización igual a DesnormalizadoNormalizadoInfinito Distribución de valores ( 6 bits)
Números interesantes Descripción Exp(8) Fracc(23) Valor Numérico Cero 00…00 00… Positivo más Pequeño Desnorm. 00…00 00…01 2 – {23,52} X 2 – {126,1022} Sencillo 1.4 X 10 –45 Doble 4.9 X 10 –324 Más Grande Desnorm. 00…00 11…11 (1.0 – ) X 2 – {126,1022} Sencillo 1.18 X 10 –38 Doble 2.2 X 10 –308 Positivo más Pequeño Norm. 00…01 00… X 2 – {126,1022} Exactamente el número mayor desnormalizado Uno 01…11 00… Más Grande Norm. 11…10 11…11 (2.0 – ) X 2 {127,1023} Sencillo 3.4 X 1038 Doble 1.8 X 10308
Propiedades especiales El cero en punto flotante es como en enteros el cero Todos los bits = 0 Puede (casi) utilizar una comparación de enteros sin signo Se debe primero comparar bits de signo Se debe considerar -0 = 0 Los NaNs son problemáticos Será el mayor que otros valores ¿A qué podrían llegar estas comparaciones? De otra manera O. K. Desnormalizado vs. Normalizado Normalizado vs. infinito
23 Redondeo Cualquier numero x de punto flotante IEEE pueden escribirse de la forma ±(b 0. b 1 b 2 b 3 …b p-1 ) 2 X 2 E Con b 0 =0 y E max > E > E min Decimos que el número real x esta en el intervalo normalizado del sistema de punto flotante si: N min ≤ x ≤ N max De lo contrario ocurre que x está fueradel intervalo normalizado La expansión binaria de x requiere de mas de p-bits para especificar exactamente el número. La precisión p de punto flotante es demasiado pequeña para representar x exactamente.
24 Redondeo Definimos x - ≤ x ≤ x + Sea x en el intervalo normalizado y escrito en la forma normalizada: x =(b 0. b 1 b 2 b 3 … b p-1 b p b p+1 ) 2 X 2 E El número mas cercano menor o igual a x es: x - =(b 0. b 1 b 2 b 3 … b p-1 ) 2 X 2 E Mientras que el número mayor a x es: x + =(b 0. b 1 b 2 b 3 … b p-1 ) 2 X 2 E +(0.000…01) Puede generar acarreos Puede necesitar ajuste de exponente
25 Redondeo Valores correctamente redondeados Redondeo hacia abajo:round(x) = x - Redondeo hacia arriba:round(x) = x + Redondeo hacia cero:round(x) = x - si x ≥ 0 ó x + si x ≤ 0 Redondeo al justo mas cercano:
Operaciones de punto flotante Vista conceptual Primero debe calcular resultados exactos Después se debe ajustar a una precisión deseada Posiblemente se puede tener sobreflujo si el exponente es muy largo Posiblemente redondee para ajustar en la fracción Ejemplos de modos de redondeo (se ilustra el redondeo con el símbolo $) –a la unidad) Cero$1$1$1$2-$1 Redondeo hacía abajo (- )$1$1$1$2-$2 Redondeo hacía arriba(+ )$1$2$2$3-$2 El justo más cercano $1 $2 $2 $3 -$2 (por default) Nota: 1. Redondeo hacía abajo: los resultados del redondeo es cercano pero no es mayor que el verdadero resultado. 2. Redondeo hacía arriba: el resultado del redondeo es cercano pero no menor que el verdadero resultado
Detalle al justo más cercano Es el método de redondeo por default Es difícil tener algún otro tipo sin que se utilice ensamblador El resto de los métodos son polarizados estáticamente con 60 La suma de todo el conjunto de números positivos será consistentemente sobre o bajo estimadas Aplicando las otras posiciones para decimales/bits Cuando se está exactamente a la mitad del camino entre dos posibles valores Se redondeo de manera que el dígito más significativo es justo E.g., redondear a la centésima más cercana (menor que la mitad del camino) (mayor que la mitad del camino) (mitad del camino-redondeo arriba) (mitad del camino-redondeo arriba)
Redondeando números binarios Números de fracciones binarias “Justo” cuando el bit menos significativo es 0 A la mitad del camino cuando los bits de la derecha de la posición de redondeo = 100… 2 Ejemplos ValorBinarioRedondeoAcciónValor 2 3/ (<1/2-abajo) 2 2 3/ (>1/2-arriba) 2 1/4 2 7/ (1/2-arriba)3 2 5/ (1/2-abajo) 2 1/2 El bit menos significativo es 0
Repaso: convertir números Caso sencillo: Si el denominador es un exponente 2 (e.g. 2, 4, 8, 16, etc.) entonces es fácil realizar la conversión: Represente el valor en punto flotante = -3/ /100 2 = Normalizando 2 -1 (-1) s (1 + fracción) 2 (127+Exp) (-1) s ( … 0000) 2 (126) decimales a punto flotante Ejemplo 1
Representar 1/3 en el formato de punto flotante 1/3 = … 10 = … = 1/4 + 1/16 + 1/64 + 1/256 + … = … = … 2 2 0 = … 2 2 -2 Signo: 0 Exponente = = 125 = Fracción = … Ejemplo
Otra posibilidad 1/3 = … … 2 = … … 2 = … … 2 = … … 2 = … … 2 = … … 2 = … 1 … De manera que 1/3 10 = [01] 2 Ejemplo 2
Convertir 10 1 a punto flotante 1. Desnormalizar: Convertir la parte entera: 23 = 16 + (7 = 4 + (3 = 2 + (1))) = Convertir la parte de la fracción: =.25 + ( = (.03125)) = Juntar las dos partes y normalizar: = Convertir el exponente: = Ejemplo
a. 23/2 = 11.5 1 11/2 = 5.5 1 5/2 = 2.5 1 2/2 = 1 0 1/2 = 0.5 1 De manera que = b 2 = 2 = 2 = 1.25 2 = 0.5 2 = 1.0 1 De manera que = Ejemplo 3
Punto flotante a decimal Cuál es el equivalente decimal de: s exponente fracción (-1) s (1 + fracción) 2 (Exponente-127) (-1) 1 ( ) 2 ( ) = -1 (1.111) 2 (2) = =
Suma en punto flotante Operandos (-1) s1 M1 2 E1 (-1) s2 M2 2 E2 Hay que asumir que E1 > E2 Resultado exacto (-1) s M 2 E Signo s, mantisa M: Resultado de signo alineado y sumar Exponente E: E1 Fijar Si M 2, recorrer M a la derecha, incrementar E Si M < 1, recorrer M a la izquierda k posiciones, decrementar E por k Sobreflujo si E está fuera de rango Redondear M para definir la precisión de frac (–1) s1 M1 (–1) s2 M2 E1–E2 + (–1) s M
Numeros de punto flotante 1. Compara los exponentes de los dos números. Realizar un corrimiento a la derecha del número más pequeño hasta que su exponente se empate con el exponente del número más grande; 2. Sumar las mantisas; 3. Normalizar la suma, ya sea que se realice corrimiento hacía la derecha y se incremente el exponente, o se realice corrimiento a la izquierda y se decrementa el exponente; if (ocurrió desbordamiento) { break arrojar una excepción; } else { 4. Redondear la mantisa a un número apropiado de bits; } if (ya se encuentra normalizada la suma) { stop algoritmo; } else { goto paso 3; } Algoritmo de la suma
Sumar más en binario utilizando el algoritmo de la suma en punto flotante. Primero hay que convertir los números a binario en una notación científica normalizada, asumiendo que se mantiene una precisión de 4 bits = 1/2 10 = 1/ = 2 -1 = = 2 0 = = -7/16 10 = -7/ = = 2 0 = 2 -2 Ahora continuamos con el algoritmo. punto flotante Algoritmo de la suma
Paso 1. La mantisa del número con el menor de los exponentes, i.e 2 -2 se recorre a la derecha hasta que el exponente se empate con el número más grande: 2 -2 = 2 -1 Paso 2. Se suman las mantisas de los dos números ( 2 -1 ) = 2 -1 Puede utilizarse complemento a 2 para mejor visualización!!! punto flotante Algoritmo de la suma
Paso 3. Se normaliza la suma, verificando si hay desbordamiento o subdesbordamiento: 2 -1 = 2 -2 = 2 -3 = 2 -4 Debido a que 127 -4 -126, no existe ni desbordamiento ni subdesbordamiento. (El exponente polarizado podría ser o 123, que es un valor que se encuentra entre 1 y 254, que son los exponentes polarizados más pequeño y más grande) Punto Flotante Algoritmo de la suma
Paso 4. Redondear de la suma: 2 -4 La suma ya se encuentra representada por 4 bits, de manera que no hay necesidad de cambiar los bits debido al redondeo La suma es entonces: 2 -4 = = = 1/ = 1/16 10 = Que es el resultado que esperábamos de ( )= Algoritmo de la suma Punto Flotante
Propiedades de la suma Comparar con los de un grupo Abeliano ¿Es cerrado bajo la suma?Si Pero puede crear infinitos o NaN ¿Es conmutativo?Si ¿Es asociativo?No Debido al sobreflujo y al redondeo ¿Es 0 la identidad aditiva?Si ¿Cada elemento tiene su inverso aditivo?Casi Excepto para infinito y NaN Monotonicidad ¿Es a b a + c b + c?Casi Excepto para infinito y NaNs Los grupos abelianos son así llamados en honor al matemático noruego Niels Henrik Abel. Los grupos que no son conmutativos se denominan no abelianos (también no conmutativos, con menos frecuencia). Punto Flotante
Sumador de Punto Flotante Algoritmo de la suma
Multiplicación Operandos (-1) s1 M1 2 E1 (-1) s2 M2 2 E2 Resultado exacto (-1) s M 2 E Signo s: s1^s2 Fracción o mantisa M: M1 M2 Exponente E: E1 + E2 Ajuste Si M 2, se recorre M a la derecha, sobreflujo Si E está fuera de rango hay sobreflujo Se redondea M para ajustar la precisión de la fracción Implementación La multiplicación de significantes ocupa la mayor área Punto Flotante
Algoritmo de la multiplicación 1. Sumar los exponentes polarizados de los dos números, restar la polarización de la suma para obtener el nuevo exponente polarizado; 2. Multiplicar las mantisas; 3. Normalizar el producto obtenido si es necesario, haciendo un corrimiento a la derecha e incrementando el exponente; if (ocurrió desbordamiento) { break arrojar una excepción; } else { 4. Redondear la mantisa a un número apropiado de bits; } if (ya se encuentra normalizado el producto) { 5. if (signo de los operandos son iguales) { signo del producto es positivo; } else { signo del producto es negativo; stop algoritmo; } else { goto paso 3; } Punto Flotante
Ejemplo de multiplicación (1/4) Multiplicar los números por = 1/2 10 = 1/ = 2 -1 = = 2 0 = = -7/16 10 = -7/ = = 2 0 = 2 -2 Paso 1. Sumar los exponentes sin polarización: -1 + (-2) = -3 o, utilizando la representación polarizada: ( ) + ( ) – 127 = (-1 - 2) + ( – 127) = = 124 Punto Flotante
Ejemplo de multiplicación (2/4) Paso 2. Multiplicar las mantisas: El producto es 2 -3, pero se necesita mantener los 4 bits, de manera que el resultado es 2 -3 Punto Flotante +
Ejemplo de multiplicación (3/4) Paso 3. Ahora se verifica que el producto este normalizado, y entonces se verifica si el exponente estará con desbordamiento o subdesbordamiento. Para este ejemplo el producto ya está normalizado y, debido a que 127 -3 -126, no existe desbordamiento o subdesbordamiento. Paso 4. Al momento de redonder el producto no existen cambios: 2 -3 Punto Flotante
Ejemplo de multiplicación (4/4) Paso 5. Debido a que loe signos de los operandos son diferentes, el signo del producto es negativo. Así, el producto es: 2 -3 Se convierte ahora el resultado a decimal: 2 -3 = = = -7/ = -7/32 10 = De manera que = Punto Flotante
Propiedades de multiplicación Comparación con anillo conmutativo ¿Es cerrado bajo la multiplicación?Si Pero puede generar inifinito o NaN ¿Es la multiplicación conmutativa?Si ¿Es la multiplicación asociativo?No Posiblemente se puede generar sobreflujo, y es inexacto ante el redondeo ¿Es 1 la identidad multiplicativa?Si ¿Es la multiplicación distributiva sobre la adición?No Posiblemente se puede generar sobreflujo, y es inexacto ante el redondeo Monotonicidad ¿Es a b & c 0 a c b c? Excepto para infinito y NaN Punto Flotante
Lenguage C C garantiza dos niveles floatprecisión simple doubledoble precisión Conversiones Los cambios entre int, float y double cambia los valores numéricos Double o float a int Trunca la parte de la fracción Igual que el redondeo hacia cero No está definido cuando está fuera de rango Generalmente satura a TMin o Tmax int a double Conversión exacta, mientras que int tenga un tamaño de palabra menor o igual a 53 bits int a float Se redondea de acuerdo al modo de redondeo Punto Flotante
Solución al acertijo int x = …; float f = …; double d = …; Hay que asumir que d o f es NaN x == (int)(float) x No: 24 bit de mantisa x == (int)(double) x Si: 53 bit mantisa f == (float)(double) f Si: se incrementa precisión d == (float) d No: se pierde precisión f == -(-f); Si: Sólo cambia el bit de signo 2/3 == 2/3.0 No: 2/3 == 0 d < 0.0 ((d*2) < 0.0) ¡Si! d > f -f > -d ¡Si! d * d >= 0.0 ¡Si! (d+f)-d == f No: No es asociativa Punto Flotante
Ariane 5 4 de junio de 1996 Explotó a los 37 segundos después de despegar Se perdieron $500 millones DLS ¿Por qué? Se calculó la velocidad horizontal como número de punto flotante de 64 bits. Este fue convertido a un entero de 16 bits. EL numero fue mayor que 32,767 Funcionó muy bien para el Ariane 4 Hubo un sobreflujo para el Ariane 5 Se utilizó el mismo software, pero diferente procesador Punto Flotante
Resumen El formato IEEE de punto flotante tiene propiedades matemáticas claras Representa números de la forma M 2 E Se puede razonar acerca de operaciones independientes de la implementación Como si se calculara con precisión perfecta y entonces se redondea No es lo mismo que la aritmética real Se viola la asociatividad y la distributividad Hace la vida difícil a los compiladores y las aplicaciones de programadores serios Punto Flotante