Universidad Nacional de Luján. Alejandro Adrián Iglesias. Legajo: 100267 Universidad Nacional de Luján. Alejandro Adrián Iglesias. Legajo: 100267 Introducción: Trabajo Práctico Representación de números. El presente trabajo tiene por objetivo explicar los conceptos relacionados con las formas de representación usuales de los distintos sistemas de numeración utilizados en un computador; así mismo el trabajo utilizará distintas herramientas para desarrollar los conceptos con claridad y síntesis, y dado el tema de carácter práctico más que teórico, el trabajo también se valdrá de ejemplos y guías paso a paso cuando fuere necesario. Los temas que se tratarán son los siguientes: • Representaciones en BCD (Binary Coded Decimal) • BCO. (Binary Coded Octal) • BCH (Binary Coded Hexadecimal) • Representación de Números Negativos : Módulo y Signo Complemento a la Base Reducida Complemento a la Base Exceso a 2 m-1 . • Rangos de cada representación. Ventajas y Desventajas de cada representación. • Operaciones de Suma, Resta, Multiplicación y División con Números Enteros. • Concepto de Acarreo (Carry) y Desborde (Overflow). • Representación de Números Fraccionarios. Periodicidad de la representación en diferentes bases. • Representación en Punto Flotante. Normalización. Mantisa Entera. Mantisa Fraccionaria. Bit Implícito.Rangos de Representación. Resolución. Error Absoluto. Error Relativo. Operaciones Básicas de Suma y Multiplicación en Mantisa Entera y Fraccionaria. • Representación Standard IEEE 754. Ejemplos de representación de números en Punto Flotante en las PCs : Precisión Simple (32 bits), Precisión Doble (64 bits), Precisión Extendida (80 bits). Rangos de cada Representación. Representación de Números Especiales : Cero, Infinito.NAN (Not a Number). Nombre: Alejandro Adrián Iglesias Legajo: 100267 Profesor: Jose Luis Caero. Año: 2008. Página 1 de 25 Página 2 de 25 Universidad Nacional de Luján. Alejandro Adrián Iglesias. Legajo: 100267 Universidad Nacional de Luján. Alejandro Adrián Iglesias. Legajo: 100267 Primero tomamos el 6 (siguiendo la tabla BCD natural), se traduce a 0110, luego el 9 quedando 1001; al final el numero en BCD 01101001bcd. Representación BCD. BCD, de las siglas Binary Coded Decimal, es un sistema de codificación en el cual se utilizan cuatro dígitos binarios para representar a cada dígito decimal. Es decir que existe una correspondencia directa entre un digito decimal y cierta cantidad de bits. En cambio, cuando se hace conversión de binario a decimal típica no hay una existe dicha relación entre el dígito decimal y el dígito binario. Siguiendo otro ejemplo: Existen distintas tablas de conversión de BCD, que corresponden a distintas codificaciones. Decimal 0 1 2 3 4 5 6 7 8 9 Natural 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 Aiken 0000 0001 0010 0011 0100 1011 1100 1101 1110 1111 Exceso 3 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 Ejemplo: Conversión directa típica entre un número en decimal y uno binario. 6910 = 10001012 En BCD: 6910 = 01101001bcd Este código es utilizado, entre otras aplicaciones, para la representación de las cifras de los números decimales en displays de 7 segmentos. Al mero modo ilustrativo se presenta el siguiente esquema de dicho decodificador. (fuente: http://proyectoselectronics.blogspot.com/2008/04/decodificador-bcd-7-segmentos-parte2.html). En cuanto el código de exceso a 3 cabe destacar que era utilizado comúnmente en los ordenadores más viejos. Este es un código sin carga, cuya asignación se obtiene del correspondiente valor en BCD una vez se haya sumado 3. Caso práctico. Para realizar una conversión de BCD, los pasos a seguir son simples. Primero se divide el número decimal en cuantas cifras tenga, acto seguido se busca en la tabla de codificación correspondiente el digito y se forma el número en el mismo sentido en que es leído; más prácticamente siguiendo un ejemplo: 6910 Página 3 de 25 Página 4 de 25 Universidad Nacional de Luján. Alejandro Adrián Iglesias. Legajo: 100267 BCO. (Binary Coded Octal) BCH (Binary Coded Hexadecimal) Otras bases utilizadas frecuentemente en informática son el sistema Hexadecimal y el sistema Octal. Dichas bases al ser potencias de la base binaria, pueden ser representadas con un número discreto de bits. Por ejemplo: Convertir un número en base cuatro, basta con tomar los dígitos del número, transformarlos a binario y unirlos. 234 = 10 112 En el caso de las bases Octal y Hexadecimal sucede lo mismo. BCO. Para octal se necesitan 3 bis para representar todos los dígitos de esta base. Octal Binario 0 000 1 001 2 010 3 011 4 100 5 101 6 110 7 111 Universidad Nacional de Luján. Alejandro Adrián Iglesias. Legajo: 100267 Los números binarios son difíciles de trabajar ya que necesitan tres o cuatro veces más dígitos que su equivalente decimal por ejemplo, el número binario 111111111111 es equivalente al decimal 4095. Empero, los computadores digitales usan los números, binarios y algunas veces se hace necesario que el operador humano o usuario se comunique directa- mente con la máquina en términos de números binarios. un esquema que retiene el sistema binario en el computador pero que ¡educe el número de dígitos que el humano debe considerar, utiliza la relación que hay entre el sistema de números binarios y el sistema hexadecimal u octal. Mediante este método, el humano piensa en términos de números octales o hexadecimales y hace la conversión por medio de la inspección, cuando se hace necesaria la comunicación directa con la máquina. Así el número binario 111111111111 tiene 12 dígitos y se expresa en octal como 7777 (4 dígitos) o en hexadecimal como FFF (3 dígitos). Durante la comunicación de 1a gente (relativa a números binarios en el computador), se hace más deseable la representación hexadecimal u octal ya que puede ser usada de manera más compacta con una tercera o cuarta parte del número de dígitos necesarios para expresar el número binario equivalente. cuando un humano se comunica con la máquina (a través de tos interruptores de la consola, las luces indicadoras o por medio de los programas escritos en lenguaje de máquina), la conversión de octal o hexadecimal a binario y viceversa se hace por inspección de parte del usuario. Ejemplos de aplicación: Direcciones de memoria FFh Colores codificados en RGB, donde se expresa y se entiende de la siguiente manera FFFFFF. Es decir FF representa la cantidad de rojo que posee el color. También existe una extensión de este formato RGB-A donde se agregan 8 (dos dígitos más en hexadecimal) bits más para codificar el canal alpha (transparencia). Ejemplo: Para convertir 6457 6 -> 110 4 -> 100 5 -> 101 El número en 645 en base 2 es 110 100 101. Números negativos. En una computadora, hay varias formas de representar el signo de un número. Sin embargo para la mayoría de usos, las computadoras modernas utilizan típicamente la representación en complemento a dos, aunque pueden usarse otras en algunas circunstancias. BCH. Módulo y Signo. En Hexadecimal se necesitan de 4 bis para representar todos los dígitos de esta base. Hexadecimal 0 1 2 3 4 5 6 7 Binario 0000 0001 0010 0011 0100 0101 0110 0111 Hexadecimal 8 9 A B C D E F Una de las formas de representación más intuitiva sería llevar la convención matemática aplicada a un número binario. Es decir, para representar si un número es positivo o negativo por convención matemática a la izquierda del número se escribe + (si es > 0) o – (si es < 0). Aplicándolo podría consistir en asignar un bit para representar el signo, poner ese bit (a menudo el bit más significativo) a 0 para un número positivo, y a 1 para un número negativo. Binario 1000 1001 1010 1011 1100 1101 1110 1111 Ejemplo: El número - 3710 representándolo en binario de esta manera 1010 0101 - (010 0101) - 37 Ejemplo: Para convertir D116 D -> 1101 1 -> 0001 Los bits restantes en el número indican la magnitud (o el valor absoluto). Por lo tanto en un byte con solamente 7 bits (aparte del bit de signo) la magnitud puede tomar valores desde 01111111(+127)a 0000000 (0), y de aquí a 11111111 (-127). Así se puede representar números desde -12710 hasta +12710. El número en D116en base 16 es 1101 0001. Página 5 de 25 Página 6 de 25 Universidad Nacional de Luján. Alejandro Adrián Iglesias. Legajo: 100267 Universidad Nacional de Luján. Alejandro Adrián Iglesias. Legajo: 100267 Una consecuencia directa de esta representación es que hay dos maneras de representar 0, 00000000 (0) y 10000000 (-0). Donde de algún modo se podría decir que hay redundancia, no obstante matemáticamente no es erróneo porque el 0 no tiene signo por ser nulo por lo que -0 = +0 = 0. Complemento a uno. Algunas de las primeras computadoras binarias (por ejemplo la IBM 7090) utilizaron esta representación, quizás por su relación obvia con la práctica habitual (Muchas computadoras decimales también usaron el sistema "signo y magnitud). Ejemplos: 1710 = 000100012 111011102 = - 1710 010 = 000000002 Más ejemplos: 001010112 = + 43 011111112 = + 127 000000002 = + 0 101010112 = - 43 111111112 = - 127 100000002 = - 0 Este modo de representación generalizando tiene un rango de - (2 número de bits. n-1 -1) a + (2n-1 -1), donde n es el Complementos. Los números negativos en una computadora usualmente se representan por un sistema de complemento. Esto consiste en tratar de eliminar la necesidad de mostrar un número negativo directamente. Para entender mejor el concepto se establece la siguiente analogía. Si se quiere retroceder en un odómetro(cuenta kilómetros) de un automóvil se obtendría el siguiente fenómeno: - 9910 = 100111002 011000112 = 9910 111111112 = 010 Para sumar dos números representados en este sistema, uno hace una suma binaria convencional, pero es necesario sumar el último acarreo obtenido al resultado de la suma. Para ver porqué esto es necesario, consideramos el caso de la suma de −1 (11111110) a +2 (00000010). La adición binaria daría solamente 00000000, que no es la respuesta correcta. Solamente cuando se suma el acarreo al resultado obtenemos el resultado correcto (00000001). Este sistema numérico de representación era común en computadoras más antiguas; el PDP-1 y la serie de UNIVAC 1100/2200, entre muchas otras, utilizaron la aritmética en complemento a uno. (Una observación de terminología: El sistema es conocido como “complemento a uno” porque la negación de x se forma restando x a una cadena larga de unos. La aritmética del complemento a dos, por otra parte, forma la negación de x restando la potencia de dos que utiliza un bit más en la representación (Siguiendo con el ejemplo de 8 bits el número a restar sería 100000000). Al igual que en el concepto de magnitud y signo el rango: - (2n-1 -1) a + (2n-1 -1). 0003, 0002 , 0001, 0000, 9999, 9998 Viéndolo de esta manera, si estamos en la posición 0025 y retrocedemos 43 posiciones tenemos el 0982 el que se comporta como el -18. Bajo este concepto simple es que se extienden las distintas formas de representación por complemento. Complemento a la base disminuida. El complemento de un número D de n dígitos, se obtiene restándolo de bn - 1. También se puede hacer complementando cada dígito de D sin sumarle 1. X´ = bn-1 - | X | Complemento a la base o Complemento a 2. Los problemas de las múltiples representaciones del 0 y la necesidad del acarreo de salida, se evitan con este sistema. En el complemento a dos, los números negativos se representan mediante el patrón de bits que es un bit mayor (sin signo) que el complemento a uno del valor positivo. En el complemento a dos, hay un solo cero (00000000). Para negar un número (negativo o positivo) invertimos todos los bits y añadimos un 1 al resultado. La suma de un par de números enteros en complemento a dos es la misma que la suma de un par de números sin signo (excepto para la detección de desbordamiento si se usa). Por ejemplo, la suma en complemento a dos de 127 y –128 da el mismo patrón de bits que la suma sin signo del 127 y 128, tal y como se puede ver en la tabla de abajo. Ejemplos: 1710 = 000100012 111011102 = +1 111011112 = - 1710 Bajo esta representación existen dos representaciones posibles del número 0. Ejemplos: 001 000 999 998 Es el complemento a la base disminuida para números binarios. Si el MSB es 0, el número es positivo. Si es 1, es negativo. + 001 + 000 - 000 - 001 010 = 000000002 - 9910 = 100111012 011000102 +1 011000112 = 99 10 111111112 + 1 = 1 00000000 = 010 Mediante dicho sistema se obtiene un rango que va de - (2n-1) a + (2n-1 -1). Representación por exceso. Página 7 de 25 Página 8 de 25 Universidad Nacional de Luján. Alejandro Adrián Iglesias. Legajo: 100267 Esta representación consiste en trasladar el rango de números a utilizar, a un rango de números positivos adicionándole una constante. Por ejemplo: si se desea trabajar con números en el rango de números enteros [-min, max] entonces trasladamos los números al rango [0, max+min], utilizando min como constante. Notar que cada número del rango esta excedido en la cantidad min. Esta representación complica un poca las operaciones aritméticas, sobre todo las operaciones de multiplicación y de división. Por ejemplo: para la suma hay que tener en cuenta que los operandos están excedidos y por lo tanto hay que corregir el resultado restando el exceso. En la resta hay que sumarlo: (x+min)+(y+min)-min = (x+y)+min (x+min)-(y+min)+min = (x-y)+min Para el caso particular de la base 2, si se elige bien el exceso este costo puede despreciarse. Por ejemplo: si se elige 2k-1 como exceso para números de k-bits, entonces, la suma o resta del exceso consiste en cambiar el bit más significativo del número. Universidad Nacional de Luján. Alejandro Adrián Iglesias. Legajo: 100267 Rangos, Ventajas y Desventajas de cada representación. Rango: Ventajas Signo-Magnitud Complemento a 1 Complemento a 2 Exceso 2 m-1 - ( 2n-1 - 1) a + ( 2n-1 - 1 ) - ( 2n-1 ) a + ( 2n-1 - 1 ) - ( 2 n-1 ) a + ( 2n-1 - 1 ) Fácil de comprender. - ( 2n-1 - 1 ) a + ( 2n-1 - 1 ) Implementación sencilla. Consiste en sumar una misma cantidad positiva 2m-1 a cada número a representar. Un número X será representado por X+ 2m-1 cuando X se lo representa con m bits. Ejemplo para 8bits: 63 63 + 1 1+ 0 0+ -1 -1 + -2 -2 + 64 = 64 = 64 = 64 = 64 = 127 65 64 63 62 Única representación del 0. Única representación del 0. Sin necesidad de acarreo a la salida. Desventajas. 11111111 10000001 10000000 01111111 01111110 Implementación en operaciones aritméticas. Doble representación del número cero. Rango: - (2n-1) a + (2n-1 -1). Página 9 de 25 Necesidad del acarreo de salida. No es natural. No es natural. Doble representación del número cero. Página 10 de 25 Universidad Nacional de Luján. Alejandro Adrián Iglesias. Legajo: 100267 Universidad Nacional de Luján. Alejandro Adrián Iglesias. Legajo: 100267 significado del arrastre. Para simplificar las restas y reducir la posibilidad de cometer errores hay varias soluciones: Operaciones de Suma, Resta, Multiplicación y División con Números Enteros. Suma. Es el sistema decimal, cuando se suman dos números y el resultado de la misma es mayor o igual que diez (base de este sistema de numeración), se produce un acarreo que debe ser sumado a la próxima columna de la izquierda, es decir, la columna de dígitos más significativos siguiente. En binario es válida la misma regla, siendo más sencillo que sumar dígitos decimales, ya que los casos posibles son: 0 0 1 1 + + + + 0 1 0 1 Ejemplos Sin acarreo Con acarreo. 1010 +101 1111 1111 1001 +1111 11000 = = = = 0 0 1 1 - = = = = 0 1 (Con acarreo negativo) 1 0 Ejemplo: 1 1 1010 - 101 0101 0 1 1 10 ( con acarreo de 1) 11 1011 +111 10010 0 1 0 1 10011 1 110 1101 + 1111 100010 Resta. La técnica de la resta en binario es, nuevamente, igual que la misma operación en el sistema decimal. Sin embargo la operación binaria, que es más sencilla. Multiplicación. La multiplicación es un método por el cual un número se suma tantas veces a sí mismo, como lo especifica el multiplicador. En el sistema decimal el procedimiento que se efectúa es, multiplicar el multiplicando por cada uno de los dígitos del multiplicador. Luego, realizar la suma de los productos parciales, encolumnando a los mismos de forma adecuada (corriendo a cada uno, una posición hacia la izquierda) para obtener el producto final. En binario es válida la misma regla. 0 0 1 1 Las restas 0 - 0, 1 - 0 y 1 - 1 son evidentes: 0–0=0 1–0=1 1–1=0 * * * * 0 1 0 1 = = = = 0 0 0 1 Ejemplo. La resta 0 - 1 se resuelve, igual que en el sistema decimal, tomando una unidad “prestada” de la posición siguiente: 10 - 1, es decir, 210 – 110 = 1. Esa unidad prestada debe “devolverse”, sumándola, a la posición siguiente. Veamos algunos ejemplos: 111 – 101 = 010 710 – 510 = 210 10001 – 01010 = 00111 1710 – 1010 = 710 11011001 – 10101011 = 00101110 21710 – 17110 = 4610 111101001 – 101101101 = 001111100 48910 – 36510 = 12410 A pesar de lo sencillo que es el procedimiento de restar, es fácil confundirse. Ya que naturalmente se tiene interiorizado el sistema decimal y se realiza mecánicamente, sin detenerse a pensar en el Página 11 de 25 En un ordenador, sin embargo, la operación de multiplicar se realiza mediante sumas repetidas. Eso crea algunos problemas en la programación porque cada suma de dos UNOS origina un arrastre, que se resuelven contando el número de UNOS y de arrastres en cada columna. Si el número de UNOS es par, la suma es un CERO y si Página 12 de 25 Universidad Nacional de Luján. Alejandro Adrián Iglesias. Legajo: 100267 es impar, un UNO. Luego, para determinar los arrastres a la posición superior, se cuentan las parejas de UNOS. Universidad Nacional de Luján. Alejandro Adrián Iglesias. Legajo: 100267 Acarreo El Acarreo en la matemática elemental es un dígito que ha sido transferido de una columna de dígitos a otra columna de dígitos de mayor potencia en un algoritmo de cálculo. La división. La división consiste en determinar cuantas veces puede sustraerse un número de otro. En el sistema decimal, el procedimiento que se efectúa es examinar el dígito más significativo del dividendo y observar si el divisor es menor. En caso de no serlo, se examinan los dos dígitos más significativos y así sucesivamente, hasta que se cumpla la condición antes dicha. Finalmente, hay que determinar las veces que el divisor está contenido en esos dígitos. Para ello se realiza el producto entre el valor que indica las veces que el divisor está contenido en esos dígitos, restando este producto al dividendo. El valor de la resta representa una fracción del divisor. En binario es válida la misma regla. Por ejemplo, en el siguiente algoritmo de suma con papel y lápiz, el dígito 1 es el acarreo: ¹ 27 + 59 ---86 En referencia a un circuito digital como un sumador, la palabra acarreo es usada de forma similar. En la mayoría de las computadoras, el acarreo del bit de mayor potencia de una operación aritmética (o el desplazamiento del último bit, en una operación de desplazamiento) es ubicado en un bit especial, llamado bit de acarreo el cual podrá ser usado como entrada de acarreo en una operación aritmética de precisión múltiple, o será usado para el control de ejecución de un programa de computación. Ejemplo: Desbordamiento. Cuando el resultado de sumar dos o más números (hablando en sistema numeral decimal) es igual o mayor que 10 (diez), se coloca la primera cifra bajo la columna que se está sumando y la segunda cifra marca el desbordamiento y se añade a la siguiente columna a la izquierda. Ejemplo: en la suma 6 + 8 = 14, la cifra 1, marca el acarreo y debe sumarse a la siguiente columna de acuerdo al valor relativo de la misma; en este caso es cero, por tanto, puede expresarse como 0 + 1 = 1. En informática es motivo de fuertes precauciones para evitar su aparecimiento o tratarlo si aparece. Al realizar una operación aritmética en binario, si el bit más alto resulta conllevar un acarreo, no hay forma de representar una cifra más para ese acarreo. Por ejemplo, si sumamos dos números de 32 bits y solo podemos representar su resultado en 32 bits pero el resultado conlleva un acarreo, necesitaríamos 33 bits para poder representarlo, pero como esto no es posible, ese valor se pierde dando lugar a un error de cálculo. Para tales casos de desbordamiento y de acarreo existen flags de estado en el procesador que reflejan tales sucesos. Estos flags son los llamados C (carry), y O (overflow). En los lenguajes de bajo nivel se puede verificar el estado de estos flags. En assembler existen instrucciones de salto condicional como lo son JC (saltar si hay acarreo), JO ( Saltar si hay overflow), y sus negaciones JNC y JNO. Página 13 de 25 Página 14 de 25 Universidad Nacional de Luján. Alejandro Adrián Iglesias. Legajo: 100267 Representación de Números Fraccionarios. Universidad Nacional de Luján. Alejandro Adrián Iglesias. Legajo: 100267 Representación en Punto Flotante. En ciencias puras y aplicadas, es frecuente tener que utilizar números muy grandes y muy pequeños. Para facilitar su representación, se desarrolló la denominada notación científica, en la que el número es representado mediante dos cantidades, la mantisa y la característica, separadas por la letra “E”. La mantisa es la parte significativa del número (las cifras significativas que se conocen [5] ). La característica es un número entero con signo, que indica el número de posiciones que hay que desplazar a la derecha o a la izquierda el punto decimal (explícito o implícito). Por la razón señalada (que la característica indica la posición del punto decimal), esta representación es también conocida como de "punto flotante". La característica puede ser interpretada también como la potencia de 10 por la que hay que multiplicar la mantisa para obtener el número. Es decir: si V es el número, m la mantisa, y c la característica, resulta: V = m . 10c. Esta notación (matemática tradicional) es equivalente a V = mec = mEc en notación científica. Ejemplos: Expresión Valor 23.45e6 23.45 10^6 == 23450000 -2e-5 -2.0 10^-5 == -0.00002 3E+10 3.0 10^10 == 30000000000 -.09E34 -0.09 10^34 == -900000000000000000000000000000000 La informática, que en sus comienzos estaba nutrida por profesionales de otras disciplinas técnicas y científicas, adoptó una variación de la notación científica para representación interna (binaria) de las cantidades fraccionarias. Por esta razón, es costumbre informática que los números fraccionarios sean denominados de coma o punto flotante ("floating-point") y a las operaciones aritméticas realizadas con ellos, operaciones de punto flotante FLOP ("FLoating -point- OPeration"). Para los números de "punto flotante", se ha asignando un bit para el signo; un cierto número de bits para representar el exponente y el resto para representar la parte más significativa del número (la mantisa), aunque en este caso, la característica no se refiere a una potencia de diez sino de dos. Es decir: un valor V puede ser representado por su mantisa m y su característica c mediante: V = m . 2c. Así pues, la representación binaria de los números fraccionarios utiliza tres componentes: • • • Notación normalizada. Puede verse que la notación científica permite varias formas para un mismo número. Por ejemplo, para el número 12.31 serían, entre otras: 12.31e0 1231e-2 123.1e-1 1.231e1 0.1231e2 0.01231e3 La representación de números fraccionarios que necesita de una menor cantidad de dígitos en notación Científica, es aquella que utiliza un punto decimal después de la primera cifra significativa de la mantisa. Esta forma de representación se denomina normalizada (el resto de formas posibles se denominan subnormales). En el caso del número anterior, la notación normalizada sería: 1.231e1. Nota: observe que en esta forma el exponente es mínimo, y representa la utilización de la máxima cantidad de cifras significativas en la mantisa, de forma que para una cantidad de cifras determinada, es la que permite mayor precisión. Según lo anterior, la mantisa m de la forma normalizada de un número distinto de cero, puede expresarse como suma de una parte entera j y otra fraccionaria f, m = j + f. Siendo j un dígito decimal distinto de cero (1-9), y f una cantidad menor que la unidad denominada fracción decimal. De forma el número puede ser expresado mediante: V = ± 0 (j + f) 10c §7.1.1a En el caso del ejemplo esta representación sería: + (1+ 0.231) 101. Página 15 de 25 Signo S es un número binario de un bit representando el signo (0 == positivo, 1 == negativo). Generalmente es el bit más significativo (de la izquierda). Exponente c es un número binario representando la potencia de 2 por la que hay que multiplicar la mantisa. Cuanto mayor pueda ser este exponente, mayor será el valor absoluto del mayor número que puede ser representado. Mantisa m es un número binario que representa las cifras significativas del número. Por supuesto, cuanto mayor sea la precisión deseada (más cifras significativas conocidas), mayor debe ser el espacio destinado a contener esta parte. Consideramos los bits numerados de derecha a izquierda, de 0 a N-1 (siendo N el número total de bits que se utilizará en la representación). El signo está representado por el último bit (bit N-1). A continuación le siguen los bits destinados al significando y finalmente los del exponente. Si se destinan e bits para contener al exponente (representados E), y m para contener la mantisa (representados M), el esquema de almacenamiento es: <--------------- N --------------> Espacio total de almacenamiento (bits) S EEEEEEEE MMMMMMMMMMMMMMMMMMMMMMM Distribución 1 <-- e -> <---------- m --------> Longitud de campos | | | | | N-1m+e m m-1 0 Numeración de los bits Es interesante observar que los desplazamientos ("Shift") izquierdo o derecho de los bits de la mantisa, equivalen respectivamente a multiplicar o dividir por dos su valor, lo que podría compensarse disminuyendo o aumentando el valor del exponente en una unidad. Para evitar ambigüedades se recurre a la normalización ya señalada, de forma que se minimiza el valor del exponente, y cualquier valor V (distinto de cero) puede ser representado mediante la fracción normalizada f de su mantisa (f # 0), con lo que puede ser representado en la forma: V = ± 2c (1 + f) Página 16 de 25 Universidad Nacional de Luján. Alejandro Adrián Iglesias. Legajo: 100267 Universidad Nacional de Luján. Alejandro Adrián Iglesias. Legajo: 100267 Bit implicito o fantasma. Algoritmos básicos de coma flotante. Dado que la mantisa siempre se representa normalizada, el primer bit en q es siempre 1, por lo que no es necesario almacenarlo proporcionando un bit significativo adicional. Esta forma de almacenar un número en punto flotante se conoce con el nombre de técnica del 'bit fantasma'. La aritmética sobre números en coma flotante es simple. La suma y la resta son las operaciones más complejas de todas. Veremos solamente la suma ya que, la resta puede ser fácilmente transformada en suma simplemente cambiando el signo del sustraendo. Suma: (±m1 ·be1) + (±m2 ·be2) = (±m ·be). Asumiendo que e1 ≥ e2, comenzamos desnormalizando la mantisa m2 con corrimientos hacia la derecha. Esto lo hacemos para igualar los exponentes. Luego, de esta operación tenemos que: ±m2 ·be2 = ( ±m2/be1-e2 )·be1 . Luego, realizamos la suma: (±m1 · be1)+ (±m2 · be2) = (±m1 · be1) + (±m2/be1-e2 ) · be1 = (±m1 + ±m2/be1-e2 ) · be1 = (±m ·be). Rango de representación. Máximo en valor absoluto: 2^(c) (Donde c = cantidad de bits destinada al Exponente) c Mínimo - 2 (1 + f) c Máximo +2 (1 + f) Errores. Cuando hacemos cómputo científico existen muchas fuentes de error que nos pueden conducir a resultados erróneos Algunas de esas fuentes son: 1) Modelo matemático no adecuado, 2) incertidumbre en la información, 3) Errores de truncamiento y redondeo. Hay varias formas de medir el error: Error Absoluto = |x – fl(x) | Error Relativo = |x – fl(x) | |x| En algunos casos, es necesario normalizar el resultado. Cuando los signos de los operandos son iguales, entonces, en el peor de los casos se produce acarreo en el MSB de la mantisa de resultado. La normalización del resultado en este caso, consiste en correr la mantisa un lugar hacia la derecha y sumar uno al exponente. Cuando los signos son distintos, la resta puede generar varios ceros a la derecha de la coma hasta tener un dígito significativo en el resultado. En este caso la normalización consiste en correr la mantisa hacia la izquierda hasta que el MSB se encuentre inmediatamente a la derecha de la coma y restar al exponente la cantidad de corrimientos realizados en la mantisa. La multiplicación en coma flotante, es más simple que la suma. Se resuelve multiplicando las mantisas y sumando los exponentes: (±m2 · be1) · (±m2 · be2) = (±m1 · ±m2) · be1+e2 En algunos casos, el resultado es menor que 0,5, por lo tanto, es necesario normalizarlo corriendo la mantisa a la izquierda hasta el MSB y restando al exponente la cantidad de corrimientos. La diferencia entre los dos errores es que el error absoluto ofrece información sobre la concordancia de puestos decimales mientras que el relativo nos dice cual es el acuerdo de los valores en cifras significativas. Se puede probar que el error absoluto máximo cometido al aproximar un número con su punto flotante (obtenido mediante el truncamiento de la serie), es |x – fl(x) |< 2^(1-t) . 2^(e). Donde t es el número de dígitos disponibles para la mantisa. Asimismo se puede probar que el correspondiente error relativo está acotado por 2^(1-t). Ejemplo: Supongamos que solamente podemos guardar 4 puestos decimales en nuestra máquina y se desea hacer una suma. Valor 1.3467 -1.3452 0.0015 Real Valor Aprox. 1.347 -1.345 0.002 Dígitos sig. 4 4________ 1 El error cometido es de 33%. ( 0.002 = 0.0015(1+0.33)) Página 17 de 25 Página 18 de 25 Universidad Nacional de Luján. Alejandro Adrián Iglesias. Legajo: 100267 Universidad Nacional de Luján. Alejandro Adrián Iglesias. Legajo: 100267 Representación Standard IEEE 754. En 1985, el IEEE (Institute of Electrical and Electronics Engineers) publicó la norma IEEE 754. Una especificación relativa a la precisión y formato de los números de "punto flotante". Incluye una lista de las operaciones que pueden realizarse con dichos números, entre las que se encuentran las cuatro básicas: suma, resta, multiplicación, división. Así como el resto, la raíz cuadrada y diversas conversiones. También incluye el tratamiento de circunstancias excepcionales, como manejo de números infinitos y valores no numéricos. La mayoría de compiladores utilizan este formato para la representación de los números fraccionarios, aunque en realidad, la adopción de este estándar se debe a que el hardware que los sustenta también lo sigue. De hecho, esta es la representación interna utilizada por los procesadores, ya que en la actualidad prácticamente el 100% de las máquinas que se fabrican siguen el Estándar en lo que se refiere al tratamiento y operación de los números de "punto flotante". El proceso de estandarización de las operaciones de punto flotante comenzó paralelamente al desarrollo por Intel (1976) de lo que serían los coprocesadores aritméticos 8087. A partir de entonces podía asegurarse que X + (Y + Z) proporcionaría el mismo resultado que (X + Y) + Z con cualquier compilador y cualquier terna de números. No olvidemos que es precisamente a partir de la aparición de los coprocesadores matemáticos, cuando la realización de operaciones con números fraccionarios se encomiendan al silicio (hardware), en vez de a rutinas software que, hasta entonces, eran específicas de cada compilador y cada plataforma. Formatos. En lo referente a la representación binaria de los números, el Estándar utiliza tres formatos denominados de precisión, doble y extendida. aunque existe un cuarto, denominado de cuádruple precisión, no contemplado en la norma que es también un estándar de facto. Los tamaños son los siguientes: Precisión Bytes bits Simple 4 32 Doble 8 64 Extendida >= 10 >= 80 Cuádruple 16 128 En todos los casos se utilizan tres campos para describir el número: El signo S, el exponente k y el significando (mantisa) n, que se almacenan en ese orden en memoria (no en los registros del procesador). • El signo S, se almacena como es usual en un bit (0 significa positivo, 1 negativo). • El exponente k se almacena en forma de un número binario con signo según una regla que, como veremos a continuación, depende del rango y del formato. • El significando n se almacena en forma normalizada, salvo cuando se representan significados especiales (ver a continuación). El esquema de la distribución utilizada para los de simple y doble precisión es el indicado. Espacio (bits): 1 <-- 8 -> <-------- 23 ---------> Simple precisión: S EEEEEEEE MMMMMMMMMMMMMMMMMMMMMMM posición: 31 30 23 22 0 Espacio (bits): 1 <--- 11 --> <-------------------- 52 --------------------------> Doble precisión: S EEEEEEEEEEE MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM posición: 63 62 52 51 0 Página 19 de 25 La interpretación de los patrones de bits contenidos en el exponente y en el significando sigue reglas algo complicadas. El motivo es que del espacio total de posibilidades se han reservado algunas para significados especiales y circunstancias excepcionales, que es necesario considerar para prevenir los errores e imprecisiones. Por ejemplo, se considera la existencia de valores especiales: +Infinito; Infinito; NaN ("Not a Number") y una representación especial para el valor cero, lo que ha obligado a definir reglas especiales de aritmética cuando estos valores intervienen en operaciones con valores normales o entre ellos. A lo anterior se añade que existen dos tipos de representación para los valores no especiales, cada uno con sus reglas; son las denominadas formas normalizadas y subnormales. Significados especiales Definición del cero: puesto que el significando se supone almacenado en forma normalizada, no es posible representar el cero (se supone siempre precedido de un 1). Por esta razón se convino que el cero se representaría con valores 0 en el exponente y en el significando. Ejemplo: 0 00000000 00000000000000000000000 = +0 1 00000000 00000000000000000000000 = -0 • Observese que en estas condiciones el bit de signo S aún permite distinguir +0 de -0. De hecho, el compilador lo hace así, permitiendo distinguir divisiones por cero con resultado +4 y -4 . Sin embargo el Estándar establece que al comparar ambos "ceros" el resultado debe indicar que son iguales. • Infinitos: se ha convenido que cuando todos los bits del exponente están a 1 y todos los del significando a 0, el valor es +/- infinito (según el valor S). Esta distinción ha permitido al Estándar definir procedimientos para continuar las operaciones después que se ha alcanzado uno de estos valores (después de un overflow). Ejemplo: 0 11111111 00000000000000000000000 = +Infinito 1 11111111 00000000000000000000000 = -Infinito • Valores no-normalizados (denominados también "subnormales"). En estos casos no se asume que haya que añadir un 1 al significado para obtener su valor. Se identifican porque todos los bits del exponente son 0 pero el significado presenta un valor distinto de cero (en caso contrario se trataría de un cero). Ejemplo: 1 00000000 00100010001001010101010 • Valores no-numéricos: Denominados NaN ("Not-a-number"). Se identifican por un exponente con todos sus valores a 1, y un significando distinto de cero. Existen dos tipos QNaN ("Quiet NaN") y SNaN ("Signalling NaN"), que se distinguen dependiendo del valor 0/1 del bit más significativo del significando. QNaN tiene el primer bit a 1, y significa "Indeterminado", SNaN tiene el primer bit a 0 y significa "Operación no-válida". Ejemplo: 0 11111111 10000100000000000000000 = QNaN 1 11111111 00100010001001010101010 = SNaN Significados normales La representación de números no incluidos en los casos especiales (distintos de cero que no sean infinitos ni valores no-numéricos), sigue reglas distintas según la precisión y el tipo de representación (normal o subnormal). Para calcular el valor V de un número binario IEEE 754 de exponente E y mantisa M, debe recordarse que esta última representa una fracción binaria (no decimal ;-) en notación normalizada . Es decir, hay que sumarle una unidad. En estas condiciones, si por ejemplo, el contenido de la mantisa es 0.254 se supone que M = 1 + 0.254. Por su parte el cálculo de la fracción binaria es análogo al de la fracción decimal. Recordemos que la fracción decimal 1304 (0.1304) equivale a 1/101 + 3/102 + 0/103 + 4/104. Del mismo modo, la fracción binaria 1101 (0.1101) equivale a 1/21 + 1/22 + 0/23 + 1/24 = 0.8125. Teniendo en cuenta estas observaciones, el valor decimal V de una representación binaria estándar, puede calcularse mediante las siguientes fórmulas: Nota: en las fórmulas que siguen puede suponerse sustituido el signo ± por la expresión (-1)S. Donde S es el valor del bit de signo; cero si es positivo y 1 si es negativo. Página 20 de 25 Universidad Nacional de Luján. Alejandro Adrián Iglesias. Legajo: 100267 Si es un problema real, en el que es preciso calcular el valor correspondiente a un binario que sigue el estándar (por ejemplo, los datos recibidos de un instrumento de medida), además de las consideraciones anteriores, también hay que tener en cuenta el orden ("Endianness") en que pueden recibirse los datos. Simple precisión, representación normalizada: V == ± (1 + M) 2E-127 Es evidente que en estos casos E es un número tal que 0 < E < 255 (28 - 2 posibilidades), ya que en caso contrario se estaría en alguno de los significados especiales (todos los bits del exponente a 0 o a 1). Así pues, E se mueve en el intervalo 1 a 254 (ambos inclusive) Al restarle 127 queda un rango entre 2-126 y 2127. Ejemplos: 0 00001100 11010000000000000000000 Signo = +; E = 12; M = 1/21 + 1/22 + 0/23 + 1/24 + 0 + 0 + ... = 0.8125 V = + (1 + 0.8125) 212-127 = 1.8125 · 2-115 = 4.3634350 · 10-35 1 10001101 01101000000000000000000 Signo = -; E = 141; M = 0/21 + 1/22 + 1/23 + 0/24 + 1/25 + 0 + ... = 0.40625 V = - (1 + 0.40625) 2141 = - 1.40625 · 214 = - 23040 Simple precisión, representación subnormal: V == ± (0 + M) 2-127 Como se ha señalado, en estos casos es E = 0, y M es distinto de cero. La operatoria es análoga al caso anterior. Ejemplo: 0 00000000 11010000000000000000000 Signo = +; E = 0; M = 1/21 + 1/22 + 0/23 + 1/24 + 0 + 0 + ... = 0.8125 V = + 0.8125 · 2-127 = 4.77544580 · 10-39 Universidad Nacional de Luján. Alejandro Adrián Iglesias. Legajo: 100267 Traducción: Signo = E=1 M = 1/223 = 2-23 Vmin = -(1 + 2-23) 21-127 = -(1 + 2-23) 2-126 = -1.17549449 · 10-38 Es significativo que el próximo valor en escala ascendente es 1 00000001 00000000000000000000010 Signo = -; E=1 M = 1/222 = 2-22 V = -(1 + 2-22) 2-126 La diferencia entre ambos es: Imin = V - Vmin = 2-22 - 2-23 = 1.192092 · 10-7, lo que representa algo más de una parte en 10 millones. Es importante recordar que esta será la mejor precisión que podrá alcanzarse en los procesos con números de coma flotante de simple precisión. En la práctica la precisión alcanzada será aún menor, dependiendo de la suerte que tengamos y del número de operaciones encadenadas que se hayan realizado (los errores pueden ser aleatorios -que tienden a anularse entre sí- o acumulativos). El valor máximo en la representación normal, corresponde a la forma binaria 0 11111110 11111111111111111111111 Signo = + E = 254 M = 1/21 + 1/22 + ... + 1/223 = 0.9999999999 Vmax = (1 + 0.999999) 2254-127 = (1.99999999) 2127 = 3.40282346 · 1038 Ejemplos: El compilador C++Builder utiliza tres tamaños distintos para los números. Doble precisión, representación normalizada: V == ± (1 + M) 2E-1023 En estos casos es 0 < E < 2047. En caso contrario se estaría en alguno de los significados especiales (todos los bits del exponente a 0 o a 1). La operatoria es análoga a la de simple precisión, con la diferencia de que en este caso se dispone de más espacio para representar la mantisa M y el exponente E (52 y 11 bits respectivamente). Doble precisión, representación subnormal: V == ± (0 + M) 2-1023 En estos casos es E = 0, y M es distinto de cero. La operatoria es análoga a la señalada en casos anteriores. Rango de la representación IEEE 754 Precisión extendida Exceptuando los valores especiales infinitos, está claro que para la simple precisión, los valores mínimos y máximos que pueden representarse de forma estandarizada son: Vmin = - (0 + M) 2-127, donde M sea el valor mínimo de la mantisa distinto de cero. Su representación es 1 00000000 00000000000000000000001 Traducción: Signo = E=0 M = 1/223 = 2-23 = 1.19209289551 · 10-7 Vmin = 2-23 · 2-127 = 2-150 = 7.00649232163 · 10-46 En la práctica solo se consideran las representaciones normales, de forma que la forma normal más pequeña corresponde a la siguiente representación binaria: 1 00000001 00000000000000000000001 No forma parte del estándar de IEEE y es Usado principalmente en procesadores de Intel. Cuenta con un Exponente de 15 bits y Fracción de 64 bits. Es por esta razón, los registros FLP en los procesadores de Intel tienen 80 y no 64 bits. Su precisión es de 19 dígitos decimales. Página 21 de 25 Página 22 de 25 Universidad Nacional de Luján. Alejandro Adrián Iglesias. Legajo: 100267 Universidad Nacional de Luján. Alejandro Adrián Iglesias. Legajo: 100267 Lo interesante es que delta, es decir, s1-s0 debería ser 0, pero como la suma no es asociativa en esta implementación el resultado no es el esperado. Desventaja del IEEE. (Extraído de http://www.lnds.net/2007/10/precision.html) Hay consecuencias asociadas a la decisión de usar esta representación. Una de las más impactantes es la no asociatividad de los números. L asociatividad es una propiedad que nos permite decir que podemos agrupar 3 o más números de distintas maneras y los resultados van a ser los mismos. Por ejemplo, si tenemos los números 0,1;0,56 y 0,78 para sumarlos los podemos agrupar de las siguientes maneras: (0,1+0,56)+0,78 o 0,1+(0,56+0,78). En general, da lo mismo como los ordenemos, el resultado va a ser el mismo. Sin embargo esto no ocurre en los computadores. Por ejemplo, este código en javascript demuestra lo demuestra: Código javascript: var n = new Array(1001); var i; for (i = 1; i <= 1000; i++) { n[i] = i * 1.19; } s0 = 0; for (i = 1; i <= 1000; i++) { s0 = s0 + n[i]; } s1 = 0; for (i = 1000; i >= 1; i--) { s1 = s1 + n[i] } delta = s1 - s0; alert('s0 = ' + s0 + ' s1 = ' + s1 + ' s1-s0 = ' + delta); Lo que hace este código es crear un arreglo de 1000 números, desde 1 a 1000, donde cada numero es multiplicado a su vez por 1,19 (esto es como aplicarle el IVA a cada numero). Luego suma los números en orden ascendente (s0) y luego en orden descendente (s1). Al final muestra el resultado de ambas sumas, y la diferencia entre ambas (delta). Página 23 de 25 Página 24 de 25 Universidad Nacional de Luján. Alejandro Adrián Iglesias. Legajo: 100267 Bibliografía: http://es.wikipedia.org/wiki/Portada http://www.zator.com/Cpp/E2_2_4a.htm#Fraccionarios http://www.etsimo.uniovi.es/~antonio/uned/ejemplos.html http://www.esimeazc.ipn.mx/posgrado/MaterialDidactico/METODOSNUMERICOS/Metodos/Intro. http://rigel.galeon.com/ http://www.lnds.net/2007/10/precision.html Arquitectura de Computadoras De Morris Mano. Página 25 de 25