Representación de la información numérica Antonio José Velasco González Ramon Costa Castelló PID_00153515 © FUOC • PID_00153515 Representación de la información numérica Índice Introducción ............................................................................................ 5 Objetivos ................................................................................................... 6 1. Los números y los sistemas de representación .......................... 7 1.1. Sistemas de representación ............................................................. 7 1.2. Sistemas de numeración posicionales ........................................... 8 1.3. Cambios de base ............................................................................. 11 1.3.1. Método basado en el TFN ................................................... 11 1.3.2. Método basado en el teorema de la división entera ........... 12 1.3.3. Cambio de base entre b y bn ................................................ 15 1.4. Números con signo ......................................................................... 18 1.5. Suma y resta en los sistemas posicionales ...................................... 19 1.6. Multiplicación y división por potencias de la base de numeración ................................................................................ 20 1.7. Representación en notación científica ........................................... 22 1.8. Suma y resta en notación científica ............................................... 23 2. Representación de los números en un computador.................. 25 2.1. Condicionantes físicos ................................................................... 25 2.1.1. Rango de representación ..................................................... 27 2.1.2. Precisión .............................................................................. 28 2.1.3. Error de representación ....................................................... 29 2.1.4. Aproximaciones: truncamiento y redondeo ....................... 29 2.1.5. Desbordamiento .................................................................. 32 2.2. Números naturales .......................................................................... 34 2.3. Números enteros ............................................................................. 35 2.3.1. Representación de enteros en signo y magnitud en base 2 .............................................................................. 36 2.3.2. Suma y resta en signo y magnitud ...................................... 38 2.3.3. Complemento a la base ....................................................... 39 2.3.4. Representación en complemento a 2 .................................. 40 2.3.5. Cambio de signo en complemento a 2 ............................... 43 2.3.6. Magnitud de los números en complemento a 2 ................. 44 2.3.7. Suma en complemento a 2 ................................................. 46 2.3.8. Resta en complemento a 2 .................................................. 48 2.3.9. Multiplicación por 2k de números en complemento a 2 .... 49 2.3.10. Representación en exceso a M ........................................... 50 2.4. Números fraccionarios .................................................................... 57 2.5. Representación en coma flotante ................................................... 67 2.5.1. Rango de representación en coma flotante ........................ 72 2.5.2. Precisión de una representación en coma flotante ............. 75 2.5.3. Suma en coma flotante ....................................................... 80 © FUOC • PID_00153515 3. Otros tipos de representaciones .................................................... 84 3.1. Empaquetamiento de la información ............................................ 84 3.2. Representación de la información alfanumérica ........................... 86 3.3. Representación BCD ....................................................................... 88 Resumen .................................................................................................... 91 Ejercicios de autoevaluación ............................................................... 93 Solucionario ............................................................................................. 94 Glosario ..................................................................................................... 130 Bibliografía .............................................................................................. 132 Representación de la información numérica © FUOC • PID_00153515 5 Introducción Desde que se inventaron, una de las funciones principales de los computadores ha sido la realización de cálculos, tanto dentro del ámbito científico y técnico como administrativo. Los elementos fundamentales de estos cálculos son los números y las operaciones entre los mismos. No es extraño, por tanto, que se haya realizado un esfuerzo importante de análisis y estudio de las maneras de representar y trabajar con los números dentro de un computador. La adaptación de los sistemas de representación numérica al entorno de los computadores ha hecho que, finalmente, la manera en la que los humanos trabajamos con los números sea muy distinta, en muchos aspectos, de la manera en la que trabajan los computadores. Un ejemplo simple puede ilustrar la naturaleza de estas diferencias: en nuestra vida cotidiana utilizamos diez símbolos distintos para representar los números (0, 1, 2, 3, 5, 7, 6, 8 y 9), mientras que las características de la tecnología hacen que dentro de los computadores sólo haya dos símbolos distintos (0 y 1). Por otro lado, la naturaleza de las operaciones que hacemos y el tipo de números involucrados en los cálculos determinan el sistema de representación numérica más adecuado en cada caso. Hablamos de los números, muchas veces, de manera genérica, pero es importante recordar que los hay de distintos tipos: los naturales (1, 2, 3, 4, 5, 6, etc.), los enteros (−3, −10, 0, 10, etc.) y los números fraccionarios (1,025, −23,456), entre otros. Cada uno de este tipo de números presenta unas características y propiedades diferenciadas que hay que tener en cuenta en el momento de elegir la manera de representarlos dentro de un computador. En este módulo, se estudian los principales sistemas de representación de números dentro de los computadores. Se hace un énfasis especial en las características de cada una de las representaciones y se analiza la problemática introducida por las limitaciones físicas de los computadores. Representación de la información numérica © FUOC • PID_00153515 6 Objetivos Los objetivos principales que alcanzaréis con el estudio de este módulo son los siguientes: 1. Conocer los sistemas de representación de la información numérica que permiten trabajar con números naturales, con números enteros y con números fraccionarios. 2. Conocer en profundidad los sistemas ponderados no redundantes de base fija 2, 10 y 16, además de saber representar un mismo valor numérico en bases distintas. 3. Comprender y saber utilizar los formatos con los cuales se codifica la información numérica en un computador: el sistema ponderado en binario para los números naturales; signo y magnitud, complemento a 2 y exceso a M para los números enteros; y los sistemas de coma fija y de coma flotante para la representación de números fraccionarios. 4. Conocer las operaciones aritméticas básicas que lleva a cabo un computador y saber efectuarlas a mano. Estas operaciones son la suma y la resta sobre números naturales, enteros y fraccionarios. 5. Comprender los conceptos de rango y precisión de un formato de codificación de la información numérica en un computador. Esto incluye los conceptos de desbordamiento y de error de representación. 6. Conocer la manera de representar caracteres en formato ASCII. 7. Entender la manera de empaquetar datos a partir de la base 16 o el sistema BCD. Representación de la información numérica © FUOC • PID_00153515 7 Representación de la información numérica 1. Los números y los sistemas de representación El objetivo de este apartado es dar una visión de conjunto de la representación de valores numéricos. Se exponen las bases de nuestro sistema de numeración y se enumeran distintos sistemas de representación de valores numéricos. Después de esta introducción, pasamos a analizar en profundidad el sistema de representación posicional de base (o raíz) fija. Finalmente, se introducen las técnicas que nos permiten obtener las diferentes representaciones que un mismo valor numérico tiene según los parámetros que definen el sistema de numeración. 1.1. Sistemas de representación La idea de valor numérico es un concepto abstracto. El sentido de un valor numérico viene dado por la relación que mantiene con otros valores numéricos. Utilizamos esta información para relacionarla de distintas maneras con otros valores numéricos y llegar a determinadas conclusiones. Para trabajar ágilmente con este tipo de información, debemos poder representarla eficientemente, de manera que tenemos que disponer de lo que denominamos un sistema de representación numérica. Un sistema de representación numérica es una metodología que permite representar un conjunto de valores numéricos. La gama de sistemas de representación numérica es bastante amplia. Entre otros, podemos encontrar los sistemas de raíz o base, los sistemas de dígitos signados, los sistemas de restos y los sistemas racionales. Del conjunto de sistemas de representación numérica, los sistemas basados en raíz (o base) son los que más se utilizan, y en éstos centraremos nuestra atención. a Un sistema de representación numérica basado en raíz describe los valores numéricos en función de una o distintas raíces. La raíz o base del sistema de numeración indica el número de dígitos distintos de los que se dispone. Cuando trabajamos con base 10, disponemos de diez dígitos distintos para la representación: 0, 1, 2, 3, 4, 5, 6, 7, 8 y 9. Si la base del sistema de numeración es Aspectos de terminología Se puede utilizar la designación de base o raíz de manera indistinta, aunque es más habitual el uso de la palabra base: hablamos de sistemas de numeración en base n. © FUOC • PID_00153515 8 Representación de la información numérica 2, se dispone de dos dígitos, frecuentemente representados por 0 y 1. En caso de que la base de numeración sea 16, disponemos de dieciséis dígitos distintos, que normalmente se representan con: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E y F. Por otro lado, hay sistemas de numeración que utilizan más de una base. Se trata de sistemas de representación de base mixta o combinada. Los sistemas de representación que usan sólo una base reciben el nombre de sistemas de base fija. La aritmética que utilizamos de manera cotidiana se desarrolla en un sistema de numeración de base fija en el que la base de numeración es 10. Consideremos el valor numérico 321 en nuestro sistema de numeración en base 10. Para representar este valor hemos utilizado el dígito 3, el dígito 2 y el dígito 1, ordenados de una manera determinada. Estos mismos dígitos, ordenados de otra manera (por ejemplo, 213), representan un valor numérico distinto, pese a estar constituido por los mismos dígitos. Los sistemas de numeración en los cuales el orden de los dígitos es determinante en la representación numérica se denominan sistemas posicionales. Un sistema posicional es aquél en el que la representación de un valor numérico es determinada por una secuencia ordenada de dígitos. A partir de este punto, los análisis y los estudios contenidos en el resto de los apartados de este módulo harán referencia a sistemas de numeración posicionales de base fija, que son los que tienen más interés para nuestro estudio de la representación de la información numérica en los computadores. a 1.2. Sistemas de numeración posicionales Estamos acostumbrados a trabajar con sistemas de numeración posicionales. Nuestra aritmética se basa en un sistema de numeración posicional de base fija, en el que la base de numeración es 10. En este sistema, la posición que ocupa un dígito tiene asociada un peso determinado. Esto quiere decir que la representación de los números naturales empieza por 0 y los dígitos siguen hasta llegar al 9. Después del dígito 9 viene una combinación de dos dígitos, el 10, porque sólo disponemos de diez dígitos distintos. La secuencia de números naturales es de la forma: 0, 1, 2, 3, 4 ,5, 6, 7, 8 ,9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 ,20, etc. Consideremos el valor 632(10. Entendemos que este número representa 6 centenas, 3 decenas y 2 unidades. Un cambio de orden de los dígitos (por ejemplo, 326(10) comporta un cambio de los pesos asociados y, por lo tanto, un cambio del valor numérico representado. Sistema de representación de base mixta Un ejemplo de este tipo de sistema es el sistema horario, en el cual los valores varían en función de las bases 24, 60 y 60 (horas, minutos y segundos). 9 © FUOC • PID_00153515 Representación de la información numérica Un sistema de representación numérica posicional de base fija es aquél en el que un valor numérico X se representa como una secuencia ordenada de dígitos, de la manera siguiente: X = xn−1xn−2 · · · x1x0,x−1 · · · x−m donde cada xi es un dígito tal que 0 ≤ xi ≤ b − 1, donde b es la base del sistema de numeración y xi el dígito de la posición i-ésima de la secuencia. Las posiciones con subíndice negativo corresponden a la parte fraccionaria del valor numérico y se consignan a la derecha de la coma. Las posiciones con subíndice positivo corresponden a la parte entera del valor numérico y se consignan a la izquierda de la coma. Para indicar la base b del sistema de numeración seguiremos la nomenclatura X(b, donde X es la representación del valor numérico (secuencia ordenada de a dígitos) en base b. Consideremos de nuevo el valor 632(10. Podemos expresar este número en función de los pesos asociados a la posición que ocupa cada dígito de la manera siguiente: 632(10 = 6 · 100 + 3 · 10 + 2 · 1 Según la numeración que hemos establecido, en el número 632(10, el dígito 2 ocupa la posición 0, el dígito 3 ocupa la posición 1 y el dígito 6 ocupa la posición 2. Podemos reescribir la expresión anterior relacionando los pesos con la base de numeración y la posición que ocupa cada dígito: 632(10 = 6 · 102 + 3 · 101 + 2 · 100 Podemos intuir que, en general, un sistema de representación numérica posicional de base fija permite expresar un valor numérico de esta manera, según la base de numeración y la posición de cada dígito. Examinemos, ahora, el número 34,75(10. Se trata de un número con parte fraccionaria. Según la numeración de dígitos propuesta, el dígito 7 ocupa la posición −1 y el dígito 5 la posición −2, mientras que los dígitos 3 y 4 (dígitos de la parte entera) ocupan las posiciones 1 y 0, respectivamente. La expresión de este valor en función de la base de numeración y de la posición de cada dígito es: 34,75(10 = 3 · 101 + 4 · 100 + 7 · 10−1 + 5 · 10−2 Recordemos que x − k = La secuencia de dígito que representa un valor numérico en un sistema posicional debe ser ordenada, porque cada posición tiene un peso asociado. En un sistema de base fija, el valor de este peso depende de la posición que ocupa el 1 xk 10 © FUOC • PID_00153515 Representación de la información numérica dígito y de la base de numeración. El peso asociado a la posición p es bp, donde b es la base de numeración. a De esta manera: X= n −1 ∑x i =− m i bi = xn −1 · b n −1 + xn − 2 · b n − 2 + ... + x− m · b − m Esta expresión se conoce como el teorema fundamental de la numeración (TFN), y nos muestra cómo se expresa un número según la base Abreviaremos teorema fundamental de la numeración con la sigla TFN. en la que está representado. Por lo tanto, además de una secuencia de dígitos correspondiente a la representación de un valor numérico en un sistema posicional de raíz fija, habrá que cono- a cer la base de numeración para determinar el valor numérico representado. Consideremos la secuencia de dígitos 235. Ésta es una secuencia de dígitos que representa un valor numérico válido en cualquier sistema de numeración posicional de raíz fija en el que la base sea mayor o igual que 6, dado que el 5 no es un dígito válido en las bases de numeración inferiores a 6. Ahora bien, esta secuencia de dígitos representa valores numéricos distintos según la base de numeración. Por lo tanto, 235(6 ≠ 235(10 ≠ 235(16. La tabla siguiente muestra la correspondencia entre las representaciones de los valores en las bases más habituales: Base 2 Base 4 Base 8 Base 10 Base 16 0 0 0 0 0 1 1 1 1 1 10 2 2 2 2 11 3 3 3 3 100 10 4 4 4 101 11 5 5 5 110 12 6 6 6 111 13 7 7 7 1000 20 10 8 8 1001 21 11 9 9 1010 22 12 10 A 1011 23 13 11 B 1100 30 14 12 C 1101 31 15 13 D 1110 32 16 14 E 1111 33 17 15 F 10000 100 20 16 10 10001 101 21 17 11 10010 110 22 18 12 Elementos de la tabla En cada columna se representan los valores numéricos desde el 0 hasta el 18(10 en la base indicada en la casilla superior de la columna. En cada fila disponemos de la representación del mismo valor numérico en diferentes bases. La correspondencia entre estas representaciones se explica en el siguiente subapartado. 11 © FUOC • PID_00153515 El sistema de numeración con el que trabajaremos habitualmente tiene base 10 y recibe el nombre de sistema decimal. Análogamente, se denomina siste- Representación de la información numérica Un dígito binario recibe el nombre de bit, que es un acrónimo de la expresión inglesa binary digit. ma binario al sistema de numeración en base 2, sistema octal al que utiliza a base 8 y sistema hexadecimal al que utiliza base 16. 1.3. Cambios de base La secuencia ordenada de dígitos que representa un valor numérico cambia según la base b del sistema de numeración, pero hay una relación directa entre estas representaciones. Los métodos de cambio de base nos permiten encontrar la secuencia de dígitos de un valor numérico X que corresponde al sistema de numeración en base b’, a partir de la representación del valor numérico X en el sistema de numeración en base b, es decir: X(b → Método de cambio de base → X(b’ En los apartados siguientes, se exponen las dos maneras básicas de efectuar un cambio de base. 1.3.1. Método basado en el TFN Consideremos el número 324(10. Hemos visto que el TFN nos permite expresar un valor numérico según su base. Si aplicamos el TFN a este número, tenemos: 324(10 = 3 · 102 + 2 · 101 + 4 · 100 Si hacemos las operaciones indicadas a la derecha de la igualdad en base 10, obtenemos la representación en base 10 de este valor numérico, que es el que tenemos a la izquierda de la igualdad. Ahora bien, si hiciésemos las operaciones en otra base, por ejemplo en base 7, obtendríamos la representación de este valor numérico en base 7. Si hiciésemos las operaciones en base b, obtendríamos la representación en base b. La dificultad reside en operar en una base distinta de la base 10, puesto que no estamos acostumbrados a esto. Por lo tanto, este método nos será útil para pa- a sar un valor representado en una base b a base 10. Cambio de base basado en el TFN Para realizar el cambio de base siguiente: 462(7 → X(10 1) Ponemos el número en función de su base (base 7): 462(7 = 4 · 72 + 6 · 71 + 2 · 70 Utilidad de los cambios de base Los cambios de base serán de utilidad, por ejemplo, para convertir valores numéricos expresados en base 10 (nuestro sistema habitual de numeración) a base 2 (sistema de numeración habitual en los computadores), y viceversa. 12 © FUOC • PID_00153515 Representación de la información numérica Hacemos las operaciones a partir de la aritmética de la base de llegada (base 10): 4 · 72 + 6 · 71 + 2 · 70 = 4 · 49 + 6 · 7 + 2 · 1 = 240(10 Las secuencias de dígitos 462(7 y 240(10 representan el mismo valor numérico. Son dos representaciones del mismo número, expresado en sistemas de numeración que tienen bases distintas: base 7 la primera y base 10 la segunda. Podemos formalizar el proceso para transformar la representación de un valor numérico X en base b a base 10 de la siguiente manera: 1) Expresar el valor numérico X según la base b del sistema de numeración en el que está representado (siguiendo el TFN). 2) Hacer las operaciones aritméticas en base 10. Para los casos en los que b > 10, será necesario convertir los dígitos de base b a base 10 antes de hacer las operaciones. El método es válido tanto para números enteros como para números con parte fraccionaria. a Cambios de base basados en el TFN Para realizar el cambio de base siguiente: 101100,01(2 → X(10 1) Ponemos el número en función de su base (base 2): 101100,01(2 = 1 · 25 + 0 · 24 + 1 · 23 + 1 · 22 + 0 · 21 + 0 · 20 + 0 · 2−1 + 1 · 2−2 2) Hacemos las operaciones a partir de la aritmética de base 10: 1 · 25 + 0 · 24 + 1 · 23 + 1 · 22 + 0 · 21 + 0 · 20 + 0 · 2-1 + 1 · 2-2 = = 1 · 32 + 0 · 16 + 1 · 8 + 1 · 4 + 0 · 2 + 0 · 1 + 0 · 0,5 + 1 · 0,25 = 44,25(10 Para realizar el cambio de base siguiente: AF2C,2(16 → X(10 1) Ponemos el número en función de su base (base 16): AF2C,2(16 = A · 163 + F · 162 + 2 · 161 + C · 160 + 2 · 16−1 2) Hacemos las operaciones a partir de la aritmética de base 10. En este caso, encontramos que la base inicial es mayor que 10. Por lo tanto, deberemos transformar los dígitos antes de hacer las operaciones: A · 163 + F · 162 + 2 · 161 + C · 160 + 2 · 16−1 = = 10 · 163 + 15 · 162 + 2 · 161 + 12 · 160 + 2 · 16−1 = 44844,125(10 1.3.2. Método basado en el teorema de la división entera La dificultad que se presenta con el método de cambio de base basado en el TFN para conseguir la representación de un número en una base b que no sea base 10 es que hay que hacer operaciones en esta base b. Con el objetivo de superar esta dificultad, disponemos de un método alternativo para hacer un cambio de base. Valores decimales Dígitos hexadecimales 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 A 11 B 12 C 13 D 14 E 15 F 13 © FUOC • PID_00153515 Representación de la información numérica La idea subyacente de este segundo método es ir haciendo de manera iterativa divisiones enteras de la representación en base 10 por el valor de la nueva base de numeración. Los restos de las divisiones enteras forman los dígitos de la representación en la nueva base: 317(10 → X(7 317 = 45 · 7 + 2 45 = 6·7+3 6 = 0·7+6 317(10 = 632(7 La secuencia de restos tomados en orden inverso nos da la representación en base 7. Las secuencias de dígitos 632(7 y 317(10 representan el mismo valor numérico. Son dos representaciones del mismo número, expresado en sistemas de numeración que tienen bases distintas: base 7 la primera y base 10 la segunda. Para el cambio de base de números fraccionarios, debemos separar y tratar de manera independiente la parte entera y la parte fraccionaria. a 1) Parte entera: aplicar sucesivamente el mecanismo de la división entera, dividiendo la parte entera por el valor de la nueva base, y haciendo las operaciones en base 10. La secuencia de restos obtenidos, tomados del último al primero conseguido, corresponde a la secuencia de dígitos de izquierda a derecha de la parte entera en la nueva base. Para los casos en los que la nueva base sea mayor que 10, será necesario convertir los restos obtenidos a dígitos de la nueva base. 2) Parte fraccionaria: sucesivamente, se separa la parte fraccionaria y se multiplica por el valor de la nueva base. Las operaciones se hacen en base 10. La secuencia de valores enteros obtenidos al hacer las multiplicaciones tomados del primero al último obtenido corresponde a la secuencia de dígitos de izquierda a derecha en la nueva base de representación. Para los casos en los que la nueva base sea mayor que 10, habrá que convertir los valores enteros obtenidos a dígitos de la nueva base. Finalmente, hay que juntar la parte entera y la parte fraccionaria obtenidas. Cambio de base Consideremos el siguiente cambio de base: 44,25(10 → X(2 a) Parte entera: aplicamos sucesivamente el mecanismo de la división entera, dividiendo la parte entera por el valor de la nueva base (base 2): 44 22 11 5 2 1 = 22 · 2 + 0 = 11 · 2 + 0 = 5·2+1 = 2·2+1 = 1·2+0 = 0·2+1 44(10 = 101100(2 14 © FUOC • PID_00153515 Representación de la información numérica b) Parte fraccionaria: multiplicamos sucesivamente la parte fraccionaria por el valor de la nueva base (base 2): 0,25 · 2 = 0,50 = 0,50 + 0 0,50 · 2 = 1,00 = 0,00 + 1 0,25(10 = 0,01(2 Para completar el cambio de base, hay que juntar la parte entera y la parte fraccionara que resultan: 44,25(10 = 101100(2 + 0,01(2 = 101100,01(2 Las operaciones se hacen en la base inicial (base 10 en los ejemplos anteriores). Por lo tanto, es un método especialmente útil para pasar de base 10 a otra base. Al hacer el cambio de base de la parte entera, detendremos la sucesión de divisiones cuando obtengamos un cociente 0. Al hacer el cambio de base de parte fraccionaria, detendremos la sucesión de multiplicaciones cuando la precisión sea suficiente o cuando encontremos un comportamiento periódico. De hecho, un número que tiene una parte fraccionaria con una representación finita no periódica en una base puede tener una representación infinita periódica de la a parte fraccionaria en otra base. Por ejemplo, 0,3(10 = 0,010011001(2 . Cambio de base basado en el teorema de la división entera Consideramos el cambio de base siguiente: 44844,12(10 → X(16 1) Parte entera. Hacemos la sucesión de divisiones enteras: = 2802 · 16 + 12 = 175 · 16 + 2 = 10 · 16 + 15 = 0 · 16 + 10 44844 2802 175 10 En este caso, la nueva base es mayor que 10. Deberemos transformar los restos en dígitos de la nueva base (base 16): 12(10 → C(16 2(10 → 2(16 15(10 → F(16 10(10 → A(16 44844(10 = AF2C(16 2) Parte fraccionaria. Multiplicamos sucesivamente por la nueva base: 0,12 0,92 0,72 0,52 0,32 0,12 0,92 … · · · · · · · 16 16 16 16 16 16 16 = = = = = = = 1,92 14,72 11,52 8,32 5,12 1,92 14,72 = = = = = = = 0,92 0,72 0,52 0,32 0,12 0,92 0,72 + 1 + 14 + 11 + 8 + 5 + 1 + 14 Observemos que la secuencia que obtenemos se repite (1, 14, 11, 8, 5, 1, 14, …). Esto quiere decir que se trata de un número periódico. Como en el apartado anterior, deberemos transformar los valores obtenidos en dígitos de base 16: 1(10 → 1(16 14(10 → E(16 11(10 → B(16 8(10 → 8(16 5(10 → 5(16 1(10 → 1(16 0,12(10 = 0,1EB851EB851EB...(16 = 0,1EB85 (16 15 © FUOC • PID_00153515 Representación de la información numérica Finalmente, juntaremos la parte entera y la parte fraccionaria: 44844,12(10 = AF2C,1EB85 (16 Cuando debemos transformar la expresión de un valor numérico de una base b a una base b', donde ni b ni b' son la base 10, utilizaremos la base 10 como base intermedia. Así pues, utilizaremos el primer método (basado en el TFN) para pasar de la base b a la base 10 y posteriormente el segundo método (basado en el a teorema de la división entera) para pasar de la base 10 a la base b'. Es decir, hacemos los cambios de base: 1 2 X( b ⎯⎯ → X(10 ⎯⎯ → X( b ' cuando b ≠ 10 y b' ≠ 10 Potencias de 2 1) Se aplica el método basado en el teorema fundamental de la nume216 65.536 215 32.768 214 16.384 Ejemplo de cambio entre bases distintas de la base 10 213 8.192 Consideramos el cambio de base siguiente: 2232,1(4 → X(6 212 4.096 Haremos este cambio de base en dos pasos: 211 2.048 1) Hacemos el cambio de base 232,1(4 → X(10 210 1.024 29 512 28 256 27 128 26 64 25 32 24 16 23 8 22 4 21 2 20 1 2–1 0,5 2–2 0,25 La simplificación de este tipo de cambio de base es determinada por el he- 2–3 0,125 cho de que un dígito en base bn se corresponde con n dígitos en base b. 2–4 0,0625 2–5 0,03125 2–6 0,015625 2–7 0,0078125 2–8 0,00390625 ración. 2) Se aplica el método basado en el teorema de la división entera. 232,1(2 = 2 · 42 + 3 · 41 + 2 · 40 + 1 · 4−1 = = 32 + 12 + 2 + 0,25 = 46,25(10 2) Completamos el cambio entre las bases 4 y 6 y transformamos, de esta manera, la representación obtenida en la base 10 a la base 6: 46 = 7 · 6 + 4 7=1·6+1 1=0·6+1 ↓ 46(10 = 114(6 0,25 · 6 = 1,50 = 0,50 + 1 0,50 · 6 = 3,00 = 0,00 + 3 ↓ 0,25(10 = 0,13(6 Finalmente, uniremos la parte entera y la parte fraccionaria: 46,25(10 = 114,13(6 1.3.3. Cambio de base entre b y bn Hay un tipo especial de cambio entre bases que se da cuando una base es potencia de la otra. Esta particularidad simplifica mucho la conversión. Paso de b a bn Consideramos la conversión siguiente: 10010110,01101101(2 → X(16 16 © FUOC • PID_00153515 Representación de la información numérica Vemos que una base se puede escribir en forma de potencia del valor de la otra base: 16 = 24. Este hecho nos dice que cada dígito de base 16 se corresponde con cuatro dígitos de base 2. Para cambiar de base, haremos agrupaciones de cuatro dígitos binarios y convertiremos directamente cada agrupación en un dígito hexadecimal. Las agrupaciones se hacen siempre a partir de la coma, y deben ser completas. 1001 0110 , 0110 1101 (2 9 6 , 6 D (16 10010110,01101101(2 = 96,6D(16 Si faltan dígitos para completar una agrupación, añadiremos ceros. a En el ejemplo siguiente, debemos completar las agrupaciones con ceros: 101110,101101(2 → X(16 Podemos escribir una base en función de la otra de la forma 16 = 24. El exponente es 4 y, por lo tanto, haremos agrupaciones de cuatro dígitos binarios a partir de la coma. Añadiremos los ceros necesarios para completar las agrupaciones y convertiremos directamente cada agrupación en un dígito hexadecimal: 0010 1110 , 1011 0100 (2 2 E , B 4 (16 101110,101101(2= 2E,B4(16 Paso de bn a b El cambio entre bases de este tipo es análogo al caso tratado en el apartado anterior, pero en sentido inverso, es decir, cada dígito en base bn se transformará en n dígitos en base b. Podemos ver su proceso con el cambio de base siguiente: 7632,13(8 → X(2 En primer lugar, analizamos la relación entre las bases, que es 8 = 23. Consiguientemente, cada dígito en base 8 dará lugar a tres dígitos binarios: 7 6 3 2 , 1 3 (8 111 110 011 010 , 001 011 (2 7632,13(8= 111110011010,001011(2 Podéis ver los sistemas de numeración posicionales del subapartado 1.2 de este módulo. 17 © FUOC • PID_00153515 Representación de la información numérica Debemos prestar atención al hecho de que se deben obtener exactamente n dígitos en base b por cada dígito en base bn (en este caso, tres dígitos binarios por cada dígito octal), añadiendo para cada dígito los ceros necesarios. Veamos en el ejemplo siguiente cómo cada dígito hexadecimal da lugar a cuatro dígitos binarios, ya que la relación entre las bases 16 = 24: E1B2,4F(16 → X(2 E 1 B 2 , 4 F (16 1110 0001 1011 0010 , 0100 1111 (2 E1B2,4F(16 = 1110000110110010,01001111(2 Errores habituales Con frecuencia, se cometen dos errores cuando se hacen estos dos últimos tipos de cambio de base: 1) Cuando hacemos un cambio de la base bn a la base b, cada dígito de la base bn debe dar lugar a n dígitos en la base b. Error frecuente Hay que evitar el siguiente error: A3(16 = 101011(2 donde el dígito hexadecimal A ha dado lugar a los dígitos 1010 en base 2 y el dígito 3 a los dígitos 11. En realidad, debería ser: A3(16 = 10100011(2 donde se han añadido dos ceros para completar el conjunto de cuatro dígitos que debe generar el dígito hexadecimal 3. 2) Cuando hacemos un cambio de la base b a la base bn, son necesarios n dígitos de la base b para obtener un dígito en la base bn. Error frecuente Hay que evitar el siguiente error: 1100,11(2 = C,3(16 donde los dígitos binarios 1100 dan lugar al dígito hexadecimal C y los dígitos 11 al 3. En realidad, debería ser: 1100,1100(2 = C,C(16 donde se han incorporado dos ceros por la derecha para constituir un grupo de cuatro dígitos binarios que dan lugar al dígito hexadecimal C. Actividades 1. Expresad los siguientes números en términos de su base y convertidlos a base 10: a) 46(7 b) 3AD(16 18 © FUOC • PID_00153515 Representación de la información numérica c) 10011101(2 d) 333(4 e) 333(8 f) B2,3(16 g) 2232,02(4 h) 2464,1(8 i) 1110100,01101(2 2. Haced los siguientes cambios de base: a) 3245(8 → X(10 b) 425(10 → X(2 c) AC3C(16 → X(10 d) 45367(10 → X(16 e) 344(10 → X(2 3. Convertid a hexadecimal los siguientes números: a) 111010011,1110100111(2 → X(16 b) 0,1101101(2 → X(16 c) 111011,1010010101(2 → X(16 4. Rellenad la tabla siguiente: Binario Octal Hexadecimal Decimal 1101100,110 362,23 A1,03 74,3 En cada fila, encontrad un valor numérico expresado en la base que indica la casilla superior de la columna donde está. Consignad en el resto de las casillas la representación correspondiente, según la base indicada en la parte superior. 5. Convertid los siguientes números en base hexadecimal a base 2, base 4 y base 8: a) ABCD(16 b) 45,45(16 c) 96FF,FF(16 6. Convertid a base 2 los siguientes valores: a) 4365,14(10 b) 234,2(5 c) 31,125(10 7. Convertid a base 10 los siguientes valores: a) 10011001,1101(2 b) 110011,11(4 c) 1010,11(8 1.4. Números con signo Cuando representamos magnitudes, con frecuencia les asignamos un signo (+/−), que indica si la magnitud numérica es positiva o negativa. Designaremos los números que llevan la información de signo como números con signo, en contraposición a los números sin signo, que sólo nos dan infor- a mación sobre la magnitud del valor numérico. La información de signo se incorpora con un símbolo que precede a la secuencia de dígitos que identifica la magnitud. Se utiliza el símbolo − para identifi- A veces, cuando se trabaja con números con signo, el signo positivo (+) no se escribe: sólo aparece el signo cuando se trata de un número negativo. 19 © FUOC • PID_00153515 Representación de la información numérica car las magnitudes negativas y el símbolo + para identificar las magnitudes positivas: +23(10 −456(8 −34,5(7 +AF,34(16 1.5. Suma y resta en los sistemas posicionales Estamos habituados al proceso de suma y de resta de valores numéricos en base 10. A continuación, analizaremos cuidadosamente un ejemplo en base 10 para entender el proceso de suma en otras bases. Hacemos la suma de los valores numéricos 8341(10 y 2463(10. 1 ← transportes 1 + 1 8 3 4 1 (10 2 4 6 3 (10 0 8 0 4 (10 ← resultado Fijémonos en el hecho de que la suma de dos valores numéricos se hace, en los sistemas posicionales, sumando los dígitos del mismo peso. Ahora bien, la suma de estos dígitos puede superar el valor de la base de representación (10 en nuestro ejemplo) y generar, consiguientemente, un transporte (lo que nos “llevamos”). La suma realiza, por lo tanto, progresando de derecha a izquierda, sumando en cada etapa los dígitos del mismo peso (los que ocupan la misma posición) y el transporte de la etapa precedente. La suma de estos tres dígitos da un re- El bit (dígito binario) de transporte recibe en inglés el nombre de carry. Este término es de uso habitual dentro del entorno de los computadores. sultado de dos dígitos: el dígito de la suma, y el dígito de transporte para la etapa siguiente (que será 0 si la suma de los tres dígitos es inferior al valor b de la base, 10 en este ejemplo). El ejemplo siguiente de suma de dos valores hexadecimales sigue las mismas pautas, pero ajustadas al caso de base 16 (donde tenemos dieciséis dígitos distintos): ← transportes 1 + 3 5 8 2 (16 A F 1 8 (16 E 4 9 A (16 ← resultado El proceso de suma en base 2 es análogo: 1 + 1 Tabla de suma en base 2 transporte + bit de suma ← transportes 1 1 1 1 1 0 1 1 1 0 1 0 0 (2 1 0 1 0 1 1 0 1 (2 0 0 1 0 0 0 0 1 (2 ← resultado + 0 1 0 0+0 0+1 1 0+1 1+0 20 © FUOC • PID_00153515 Representación de la información numérica En los anteriores ejemplos precedentes se pone de manifiesto que se puede producir un transporte en la última etapa de suma. Por lo tanto, el resultado de una suma de números puede necesitar para su representación un dígito más que los operandos. El resultado de la suma de dos números representados en base b donde el mayor tiene n dígitos puede requerir un máximo de n + 1 dígitos para su representación. La resta de dos valores numéricos recibe un tratamiento semejante. La opera- En inglés, el transporte en el caso de la resta recibe el nombre de borrow. ción también se realiza de derecha a izquierda, operando los dígitos de igual peso, y considerando el transporte de la etapa precedente. Se obtienen de nuevo dos dígitos: el dígito de resta y el dígito de transporte. La particularidad en esta operación es que el número de menor magnitud (sustraendo) es el que se debe restar del número de mayor magnitud (minuendo): − 1 ← minuendo 8 3 4 1 1 1 2 4 6 3 (10 ← subtraendo 5 8 7 8 (10 ← resultado (10 ← transportes El procedimiento en otras bases es idéntico. Sólo hay que adecuarse a la nueva base y procurar restar la magnitud pequeña de la grande: A F 1 8 (16 ← transportes 1 − 3 5 8 2 (16 7 9 9 6 (16 ← resultado 1 0 1 1 1 1 0 1 1 0 1 − 0 1 1 1 0 1 0 0 (2 0 0 1 1 1 0 0 1 (2 (2 ← transportes En el caso de la operación de resta, no se puede producir ningún transporte en la última etapa. Por este motivo, el resultado de una resta de números necesitará para su representación, como máximo, los mismos dígitos que el minuendo. El resultado de la resta de dos números representados en base b donde el minuendo tiene n dígitos puede requerir un máximo de n dígitos para su representación. 1.6. Multiplicación y división por potencias de la base de numeración En un sistema posicional de base fija, cada dígito tiene un peso bp, donde b es la base de numeración y p la posición que ocupa el dígito. El TFN nos permite ← resultado 21 © FUOC • PID_00153515 Representación de la información numérica expresar un número en términos de estos pesos, que son potencias de la base de numeración. En el caso de los sistemas de representación decimales, la base de numeración es 10. Por lo tanto, los pesos asociados a los dígitos son potencias de 10. Con- Podéis consultar los sistemas de numeración posicionales del subapartado 1.2 de este módulo. siguientemente, multiplicar por 10 se traduce en aumentar en una unidad la potencia de 10 asociada a cada dígito, y dividir por 10 equivale a disminuir en una unidad la potencia de 10 asociada a cada dígito. Por ejemplo, el número 56,34(10 se puede expresar en términos de los pesos asociados a cada dígito siguiendo el TFN: 56,34(10 = 5 · 101 + 6 · 100 + 3 · 10−1 + 4 · 10−2 Si multiplicamos por 10, obtenemos: 56,34(10 · 10 = (5 · 101 + 6 · 100 + 3 · 10−1 + 4 · 10−2) · 10 = = 5 · 102 + 6 · 101 + 3 · 100 + 4 · 10-1 = 563,4(10. El efecto que se obtiene es el desplazamiento de la coma fraccionaria. Multiplicar por 10 un número en base 10 equivale a desplazar la coma fraccionaria una posición a la derecha, mientras que dividirlo por 10 equivale a desplazar la coma una posición a la izquierda. El proceso se puede extender a la multiplicación y a la división por una potencia de 10: multiplicar por 10k un número en base 10 equivale a desplazar la coma fraccionaria k posiciones a la derecha, y dividirlo por 10k equivale a desplazar la coma fraccionaria k posiciones a la izquierda. Este proceso de multiplicación y división por potencias de la base de numeración que aquí encontramos ejemplificado en base 10 es válido para todos los sistemas de posicionales de base fija b. a Multiplicar por bk un número representado en un sistema posicional de base fija b equivale a desplazar la coma fraccionaria k posiciones a la derecha. Dividir por bk un número representado en un sistema posicional de base fija b equivale a desplazar la coma fraccionaria k posiciones a la izquierda. Multiplicación por una potencia de 2 en binario Para multiplicar un número binario por 2k, desplazaremos la coma fraccionaria k posiciones a la derecha. Para multiplicar el 11010(2 por 24, desplazaremos la coma fraccionaria cuatro posiciones a la derecha: 11010(2 · 24 = 110100000(2 Números sin parte fraccionaria En un número sin parte fraccionaria, desplazar la coma k posiciones a la derecha equivale a añadir k ceros a la derecha, puesto que la parte fraccionaria es cero. Por consiguiente, el resultado requerirá k dígitos más para la representación que el número inicial. 22 © FUOC • PID_00153515 Este resultado que obtenemos de manera directa se puede justificar con los siguientes cálculos: 11010(2 · 24 = (1 · 24 + 1 · 23 + 0 · 22 + 1 · 21 + 0 · 20) · 24 = = (1 · 28 + 1 · 27 + 0 · 26 + 1 · 25 + 0 · 26) = 110100000(2 Por lo tanto, 11010(2 · 24 = 110100000(2. División por una potencia de 2 en binario Para dividir un número binario por 2k, desplazaremos la coma fraccionaria k posiciones a la izquierda. Para dividir el 11100(2 por 22, desplazaremos la coma fraccionaria 2 posiciones a la izquierda: 11100(2 / 22 = 111(2 Este resultado que obtenemos de manera directa se puede justificar con los siguientes cálculos: 11100(2 / 22 = (1 · 24 + 1 · 23 + 1 · 22 + 0 · 21 + 0 · 20) / 22 = = (1 · 22 + 1 · 21 + 1 · 20 + 0 · 2−1 + 0 · 2−2) = 111(2 Por lo tanto, 11100(2 / 22 = 111(2. Las operaciones de división por una potencia de la base de numeración de un número sin parte fraccionaria pueden dar como resultado un número con parte fraccionaria: 11100(2 / 24 = 1,11(2. Ahora bien, si estamos en un contexto en el que se trabaja con números sin parte fraccionaria, podemos dar el resultado en forma de dos números enteros que reciben el nombre de cociente y resto: el cociente tiene relación directa con la parte entera del resultado y el resto, con la parte fraccionaria. En este caso, la operación recibe el nombre de división entera, mientras que, por oposición, la primera recibe el nombre de división real. El cociente y el resto de la división entera de 11100(2 por 24 se pueden obtener a partir del resultado de la división real 11100(2 / 24 = 1,11(2, identificando el cociente con la parte entera (cociente = 1(2) y el resto, con la parte fraccionaria (resto = 11(2) El cociente y el resto de una división entera de un número sin parte fraccionaria por una potencia de la base de numeración se pueden obtener a partir del resultado de división real, identificando el cociente con la parte entera y el resto, con la parte fraccionaria. 1.7. Representación en notación científica Las representaciones de números fraccionarios que aparecen en los apartados precedentes son del tipo 671,34(10. Aquí encontramos un conjunto de los dígitos que representan la parte entera y un conjunto de dígitos destinados a representar la parte fraccionaria. Supongamos que debemos trabajar con números grandes, como por ejemplo la velocidad de transmisión de la luz en el vacío (c = 299.792.500 m/s) y, si- Representación de la información numérica 23 © FUOC • PID_00153515 Representación de la información numérica multáneamente, con números muy pequeños, como por ejemplo la masa de un electrón (me = 0,00000000000000000000000000000091095 kg). Para representar números como éstos, encontramos una dificultad importante: necesitamos un número elevado de dígitos. Como en el segundo caso, muchos de estos dígitos pueden ser cero y, por lo tanto, la eficiencia de la representación puede ser bastante reducida. La notación científica es una estrategia que permite superar esta dificultad, y representar números muy grandes y números muy pequeños con un conjunto La notación científica también recibe el nombre de representación en coma flotante. de dígitos reducido. Los siguientes números están en notación científica: +2,997925(10 · 108 −6,487567(10 · 10−5 Los números en notación científica toman la forma: Cuando el número en notación científica es positivo, el símbolo + ante R se puede obviar. ±R · be donde + o − indica el signo de la magnitud representada, R es un número fraccionario que recibe el nombre de mantisa, b es la base de numeración y e es un número entero que recibe el nombre de exponente. La mantisa contiene los dígitos significativos de la magnitud representada, y está precedida por el signo de esta magnitud. El exponente marca el número de posiciones a la derecha (exponente positivo) o a la izquierda (exponente negativo) que debemos desplazar la coma fraccionaria para obtener el valor numérico representado. Veamos algunos ejemplos: +245,86(10 = +2,4586(10 · 102 −0,0003451(10 = −3,451(10 · 10 (donde R = 2,4586(10, b es 10 y e es 2) −4 +0,00000000000000000000000000000091095(10 = +9,1095(10 · 10−31 +299792500(10 = +2,997925(10 · 108 Cuando el exponente es positivo, no suele aparecer el símbolo + frente al exponente. Habitualmente se utiliza este tipo de representación para trabajar con las magnitudes de la física, como por ejemplo la velocidad de transmisión de la luz en el vacío o la masa de un electrón. 1.8. Suma y resta en notación científica El proceso de suma y de resta en los sistemas posicionales comporta operar los dígitos del mismo peso. La virtud de la notación científica es, precisamente, la capacidad de alterar el peso relativo de los dígitos mediante el exponente. Podéis ver la suma y la resta en los sistemas posicionales del subapartado 1.5 de este módulo. 24 © FUOC • PID_00153515 Por ejemplo, la primera posición a la izquierda de la coma del número +1,34(10 · 101 es 101 (ya que +1,34(10 · 101 = +13,4(10), mientras que la primera posición a la izquierda de la coma del número +45,2(10 · 10−3 es 10−3 (ya que +45,2(10 · 10−3 = +0,00452(10). Por lo tanto, la dificultad de sumar y restar números en notación científica reside en la necesidad de igualar los exponentes de los números que se deben operar. Para hacerlo, desplazamos la coma del número con menor magnitud hasta conseguir que el exponente tenga el mismo valor que en el número de mayor magnitud. A continuación podremos hacer la operación: 1,34(10 · 101 > 45,2(10 · 10−3 + 45,2(10 · 10−3 = 0, 00452(10 · 101 → +1, 3 4 0 0 0 (10 · 101 +0, 0 0 4 5 2 (10 · 101 +1, 3 4 4 5 2 (10 · 101 El exponente del resultado de la operación de suma o resta se puede volver a ajustar si es necesario: − +4, 1 3 1 0 5 (10 · 106 +4, 1 3 0 0 3 (10 · 106 +0, 0 0 1 0 2 (10 · 106 +0,00102(10 · 106 = +1,02(10 · 103 Actividades 8. Haced las siguientes operaciones en la base especificada: a) 111011010(2 +100110100(2 = b) 2345(8 + 321(8 = c) A23F(16 + 54A3(16 = d) 111011010(2 − 100110100(2 = e) 2345(8 − 321(8 = f) A23F(16 − 54A3(16 = 9. Haced las siguientes operaciones en la base especificada: a) 62,48(16 + 35,DF(16 = b) 111101101,11011(2 + 100110100,111(2 = c) 62,48(16 − 35,DF(16 = d) 111101101,11011(2 − 100110100,111(2 = 10. Haced las siguientes multiplicaciones: a) 128,7(10 · 10(10 b) AFD(16 · 16(10 c) 1101,01(2 · 2(10 11. Encontrad el cociente y el resto de las siguientes divisiones enteras: a) 52978(10 / 10(10 b) 3456(16 / 16(10 c) 100101001001(2 / 2(10 12. Escribid en notación científica el número +12044,4(10. 13. Identificad la mantisa y el exponente del número −3,143(10 · 1045. 14. Sumad los números +123,34(10 · 103 y +67,89(10 · 105. 15. Restad los números +1223,34(10 · 10−2 y +65,6789(10 · 105 Representación de la información numérica 25 © FUOC • PID_00153515 Representación de la información numérica 2. Representación de los números en un computador En el primer apartado se hace la distinción entre el valor numérico y su representación o codificación. El valor numérico es único, pero tiene una representación diferente en cada sistema de numeración. Nuestro objetivo en este segundo apartado es estudiar las representaciones que permitan almacenar y procesar de una manera eficiente los valores numéricos en el interior de un computador. Terminología A lo largo del texto, utilizaremos indistintamente representación y codificación para referirnos a la secuencia de dígitos asociada a un valor numérico en un sistema de representación numérica. 2.1. Condicionantes físicos Las restricciones de la tecnología con la que se construyen los computadores hace que el sistema binario, donde sólo se dispone de dos dígitos, sea el sistema de numeración más adecuado. Internamente, el computador asocia los dos dígitos con dos valores diferentes de tensión eléctrica (voltaje). Un dígito binario recibe el nombre de bit. Los bits pueden tomar los valores 0 y 1. Un bit constituye la unidad de información que se define como la cantidad de información asociada a la respuesta de una pregunta formulada de manera no ambigua, en la que sólo son posibles dos alternativas de respuesta y que, además, tienen la misma probabilidad de ser elegidas. Aunque el sistema de numeración habitual en los computadores es el sistema binario, trabajar directamente en base 2 suele ser poco práctico para nosotros, dada la gran cantidad de bits necesarios para representar valores numéricos usuales. Ahora bien, dada la relación directa que hay entre bases b y bn, es habitual convertir los valores numéricos internos del computador a hexadecimal, ya que es considerablemente más compacta y tiene una relación directa con a base 2 (puesto que 16 es potencia de 2, 16 = 24). Aunque se utilice la base 2 dentro de los computadores, las unidades funcionales del computador no suelen trabajar bit a bit, sino que generalmente procesan cadenas de bits de una longitud determinada. Por las mismas características del sistema binario, hay unas longitudes determinadas que ofrecen un rendimiento computacional más elevado: son las cadenas cuya longitud es una potencia de 2. Las cadenas adecuadas son, por lo tanto, las de longitud 2, 4, 8, 16, 32, 64, etc. Las cadenas de 8 bits reciben el nombre de byte u octeto. Cuando dis- Bit es un acrónimo de la expresión inglesa binary digit. © FUOC • PID_00153515 26 Representación de la información numérica ponemos de 16 bits, hablamos de cadenas de 2 bytes; de 4 bytes para cadenas de 32 bits; etc. Hay una longitud característica relacionada con un computador, que denominamos palabra y que depende de la arquitectura particular de cada computador. Una palabra es la cantidad de información con la que opera un computador. A pesar de las mejoras tecnológicas, la capacidad de almacenamiento de los computadores es finita. Esto condiciona, y mucho, la representación numérica dentro de los computadores, sobre todo cuando se trabaja con números que requieren un número infinito de dígitos para representar la parte fraccionaria, como por ejemplo los casos bien conocidos de los números irracionales, como 2. Evolución de la longitud típica de la palabra La longitud típica de la palabra evoluciona con la tecnología. Actualmente, la palabra de los procesadores que equipan los computadores de carácter general es de 32 bits, pero cada vez aparecen más procesadores que trabajan con palabras de 64 bits. Los procesadores más veteranos y muchos de los actuales microcontroladores trabajan con palabras de 4, 8 o 16 bits. Estas limitaciones físicas que tienen los computadores en la representación de valores numéricos son semejantes a las que encontramos cuando trabajamos con lápiz y papel. Por ejemplo, en los cálculos aritméticos manuales trabajamos con una aproximación de los números irracionales. Para el número π, utilizamos el valor 3,14(10 o el 3,1416(10 según el grado de precisión necesario. De una manera semejante, dentro de los computadores se trabaja con aproximaciones de aquellos números que no se pueden representar de manera exacta. Cuando un número no se puede representar de manera exacta dentro de un computador, se comete un error de representación. Este error es la distancia entre el número que queremos representar y el número representado realmente. De esta manera, si representamos el número π por el valor 3,14(10, cometemos un error igual a ⏐π − 3,14(10⏐ = 0,00159…, mientras que si trabajamos con el valor 3,1416(10 para representar el número π, el error es ⏐π − 3,1416(10⏐ = 7,3464102… · 10–6. Cuando trabajamos con lápiz y papel, escribimos los números de la manera más práctica y adecuada. Podemos escribir 03, 3,00, 3,000 o simplemente 3. En cambio, dentro de los computadores hay que seguir unas pautas más rígidas, un formato que especifique y fije el número de dígitos que hay que utilizar o el número de dígitos fraccionarios con los que se trabaja. Un formato de representación numérica es la manera específica en la que se deben representar los valores numéricos con los que se trabaja. Los números que se pueden representar de manera exacta reciben el nombre de números representables. 27 © FUOC • PID_00153515 Representación de la información numérica Por ejemplo, supongamos que tenemos definido un formato de representación de la forma x1x0, x–1x–2, donde cada dígito xi corresponde a un dígito decimal. En este formato, el número 3 se debe representar como 03,00 y el 10,2, como 10,20. Una vez definido el formato de la representación numérica, queda fijado el conjunto de números que pueden ser representados. a En los siguientes subapartados, se describen los parámetros que nos ayudan a medir la eficiencia de un formato de representación numérica: el rango de representación, la precisión y el error de representación. 2.1.1. Rango de representación Dado que el conjunto de números que se pueden representar es finito, los tendremos delimitados dentro de un intervalo que recibe el nombre de rango. De esta manera, fijado el formato x1x0,x–1x–2 en la base 10, sólo podremos representar números entre el 00,00(10 (el menor número representable en este formato) y el 99,99(10 (el mayor número representable en este formato). El número 935(10, por ejemplo, no se puede representar en este formato, ya que no Dentro del intervalo de representación… … sólo se puede representar un conjunto de números. Aunque en el ejemplo el intervalo es [0, 99,99], el número 34,789(10 no se puede representar de manera exacta, ya que tiene tres dígitos fraccionarios. está dentro del intervalo de representación. El rango de un formato de representación numérica es el menor intervalo que contiene todos los números representables. Los límites del intervalo vienen determinados por el mayor y el menor número que se pueden representar. La notación que se utiliza para especificar un rango de representación es: [a, b] donde a es el menor número que podemos representar en el formato espeficado y b, el mayor. Los números que están fuera del rango de representación de un formato determinado no son representables en aquel formato. a La notación que se utiliza para definir un intervalo de números representables es [a,b], donde a y b son los límites del intervalo y forman parte del mismo. 28 © FUOC • PID_00153515 Representación de la información numérica Hay una limitación inherente al número de bits disponibles en un formato de representación: con n dígitos en base b, disponemos de bn códigos o combinaciones de dígitos. Cada una de estas combinaciones puede representar un valor numérico. Por lo tanto, con n dígitos en base b podremos representar un máximo de bn números distintos. a De esta manera, en una representación de 5 bits disponemos de 25 = 32 combinaciones diferentes. Podremos representar un máximo de 32 valores numéricos. El tipo de codificación que se haya utilizado determinará cuáles son estos valores. Cuando trabajamos en base 10, sabemos que con cuatro dígitos disponemos de 104 códigos diferentes (combinaciones de los cuatro dígitos decimales). Si usamos estos códigos para representar números naturales, podremos representar desde el 0000 (0(10), hasta el 9999 (104 − 1). 2.1.2. Precisión Estamos habituados a trabajar de manera dinámica con la precisión, y la ajustamos automáticamente a nuestras necesidades. Si medimos la longitud de una tabla en metros, trabajamos con dos o, como mucho, con tres dígitos fraccionarios. Decimos “esta tabla mide 1,52 m”, pero difícilmente diremos “esta tabla mide 1,526246 m”. De manera intuitiva, podemos decir que un formato de representación que trabaje con dos dígitos fraccionarios tendrá suficiente precisión para esta aplicación. Un formato de estas características nos permitirá distinguir 1,52 m de 1,53 m, pero no de 1,5234 m. Decimos que la precisión de este formato es de 0,01 m, que es la distancia entre dos valores consecutivos representables en este formato. La precisión de un formato de representación numérica es la distancia entre dos números representables consecutivos. En la mayoría de los formatos… … de representación la distancia entre dos números representables consecutivos cualesquiera es la misma. Ahora bien, cuando se utiliza la notación científica la precisión es variable y depende del valor del exponente. © FUOC • PID_00153515 29 Representación de la información numérica 2.1.3. Error de representación Consideramos un formato de representación con cuatro dígitos en base 10, de los cuales dos son fraccionarios. Los números representables en este formato son de la forma x1x0,x–1x–2, donde xi es un dígito de la base 10. En este formato podemos representar el 12,34(10 o el 45,20(10 de una manera exacta. En cambio, el número 15,027(10 no se puede representar de una manera exacta. Si debemos trabajar con este número en este formato, tendremos que utilizar una aproximación. Podemos aproximar este número por un número representable cercano como el 15,03(10. Trabajar con una aproximación del número en lugar de hacerlo con una representación exacta comporta cometer un error. En este caso, el error que se comete es |15,03(10 − 15,026(10 | = 0,004(10 . El error de representación ε es la distancia entre el número X que queremos representar y el número representable X^ con el que lo aproximamos. Es decir, ε = |X − X^ | El error de representación que se puede cometer en un formato determinado está relacionado directamente con el número de dígitos fraccionarios disponibles. a Volvamos al formato x1x0,x–1x–2 en base 10. El número 23,457(10 no es representable en este formato. Lo podemos aproximar por el 23,45(10 o por el 23,46(10,, que son los dos números representables más cercanos. Los dos números están a una distancia del 23,457(10 inferior a 0,01, que es la precisión (distancia entre dos números representables consecutivos) de este formato. En general, podemos establecer que la precisión delimita el error de representación máximo que se llegará a cometer en un formato al hacer la aproximación de un número no representable que está dentro del rango de representación. Los números que no están dentro del rango de representación del formato no son representables ni aproximables. 2.1.4. Aproximaciones: truncamiento y redondeo Acabamos de establecer que el número 23,45(10 o el número 23,46(10 son buenas aproximaciones del número 23,457(10 al formato x1x0,x−1x−2 en base 10. Rangos de representación En el formato x1x0,x–1x–2 en base 10, el rango de representación es [0, 99,99]. Un número como el 128(10, que está fuera del rango de representación, no es representable. No se considera que 99,99(10 sea una aproximación válida para este número en este formato. © FUOC • PID_00153515 30 Representación de la información numérica Debemos elegir una de las dos posibilidades, por lo cual estableceremos un criterio de elección. Este proceso de elección se denomina aproximación o cuantificación. Los criterios de elección más habituales son el truncamiento y el redondeo. 1) Truncamiento El truncamiento es el criterio de cuantificación más directo y sencillo de aplicar, ya que no comporta ningún tipo de cálculo y consiste en ignorar los dígitos que sobran. En el formato x1x0,x−1x−2 en base 10, este criterio aproxima el número 23,457(10 por el 23,45(10, fruto de ignorar el último dígito, que no cabe en el formato disponible. La cuantificación o aproximación por truncamiento consiste en despreciar los dígitos fraccionarios que no caben en el formato disponible. El proceso de truncamiento no comporta ningún tipo de cálculo. Si aplicamos el criterio de truncamiento al formato que tenemos definido, encontramos que el 23,451(10, el 23,456(10 y el 23,459(10 se aproximan al mismo número representable, el 23,45(10, el número que queda si ignoramos los dígitos fraccionarios que no caben en el formato x1x0,x–1x–2 en base 10. Ahora bien, el error de representación cometido en cada caso es distinto. El error es 0,001 para el 23,451(10 (ya que ⏐23,451(10 − 23,45(10⏐ = 0,001), 0,006 para el 23,456(10 y 0,009 para el 23,459(10. En todos los casos, el error de representación es inferior a la precisión, que es 0,01 (distancia entre dos números representables consecutivos, por ejemplo 23,45(10 y 23,46(10). En una aproximación por truncamiento, el error máximo de representación es igual a la precisión del formato de representación. 2) Rendondeo Con el truncamiento, el error de representación del número 23,459(10 en el formato x1x0,x−1x−2 en base 10 es 0,009 (⏐23,459(10 − 23,45(10⏐= 0,009), porque se La gran ventaja del truncamiento es que no comporta ningún tipo de cálculo aritmético. 31 © FUOC • PID_00153515 aproxima por el número 23,45(10. Ahora bien, si aproximásemos el 23,459(10 por el 23,46(10, el error de representación sería 0,001 (⏐23,46(10 − 23,459(10⏐ = 0,001), es decir, un error menor. El 23,46(10 es más cercano al número que queremos representar y sería más lógico trabajar con el número representable más cercano que con el que obtenemos por truncamiento. Esta manera de proceder recibe el nombre de redondeo o aproximación al más próximo. Representación de la información numérica El número que se obtiene por truncamiento… … coincide con el que se obtiene por redondeo, siempre que el número resultante por truncamiento sea el número representable más cercano al número que queremos representar. La cuantificación o aproximación por redondeo consiste en elegir el número representable más cercano al número que queremos representar. El proceso de redondeo comporta operaciones aritméticas. Con el redondeo reducimos el error máximo a la mitad, pero tiene el inconveniente de requerir cálculos aritméticos. Si aplicamos el criterio de redondeo al formato x1x0,x−1x−2 en base 10, el 23,451(10 se aproxima por el 23,45(10, mientras que el 23,456(10 o el 23,459(10 se aproximan por el 23,46(10, que les es más cercano. El error de representación es 0,001 para el 23,451(10, 0,004 para el 23,456(10 y 0,001 para el 23,459(10. El error de representación cometido es inferior a la mitad de la precisión, es decir, inferior a 0,005 en este caso. En una aproximación por redondeo, el error máximo de representación es igual a la mitad de la precisión del formato de representación. Una manera sencilla de aplicar el redondeo al número 23,459(10 al formato x1x0,x−1x−2 en base 10 es sumarle la mitad de la precisión (es decir, 0,005) y a con- tinuación hacer el truncamiento del resultado: 23,459(10 + 0,005(10 = 23,464(10, que truncado en dos dígitos fraccionarios es el 23,46(10, el número representable más cercano al 23,459(10. Para aproximar un número por redondeo, debemos hacer lo siguiente: 1) Sumar la mitad de la precisión del formato de representación al nú- mero que se quiere aproximar. 2) Truncar el resultado de la suma según el número de dígitos fraccio- narios disponibles en el formato de representación. Aproximación por redondeo Para aproximar por redondeo el número 1,526246(10 al formato x1x0,x–1x–2x–3x–4 en base 10, procederemos de la siguiente manera: 1) Sumar la mitad de la precisión del formato de representación al número que se quiere aproximar: 1,526264(10 + 0,00005(10 = 1,526314(10 Para hacer el redondeo, sumamos la mitad de la precisión porque equivale a sumar la mitad de la distancia entre dos números representables consecutivos. 32 © FUOC • PID_00153515 Representación de la información numérica 2) Truncar el resultado de la suma según el número de dígitos fraccionarios disponibles en el formato de representación: 1,526314(10 → 1,5263(10 Por lo tanto, el número 1,526264(10 se aproxima por redondeo a este formato por el 1,5263(10. El inconveniente del redondeo es que, a diferencia del truncamiento, comporta operaciones aritméticas. a 2.1.5. Desbordamiento Las características y restricciones propias de los computadores hacen que el formato de representación de los valores numéricos deba estar plenamente definido. El formato establecido fija el rango de representación. De esta manera, si el formato es de 4 bits para representar números naturales, el rango en decimal queda fijado en [0000(2, 1111(2] = [0(10, 15(10]. No podremos representar números fuera de este rango. Cualquier operación que genere como resultado un valor numérico fuera de este rango provocará desbordamiento. El desbordamiento aparece cuando el número que se debe representar supera el rango de representación disponible. Esto quiere decir que el número no cabe en el formato disponible para representarlo. En la figura siguiente, se muestra de manera gráfica una situación en la que se produce desbordamiento: Podemos ver un ejemplo de desbordamiento en la siguiente operación de suma, donde el formato es de 6 bits para representar números naturales: 1 + 1 ← transportes 1 1 1 0 1 1 1 0 (2 1 0 0 1 0 1 (2 0 1 0 0 1 1 (2 ↑ desbordamiento ← resultado En inglés, el término desbordamiento recibe el nombre de overflow. © FUOC • PID_00153515 33 Representación de la información numérica El resultado de la suma anterior requiere 7 bits y por tanto está fuera del rango de representación del formato en el que se trabaja. El formato definido sólo puede almacenar los 6 bits de menos peso. No puede incluir el bit más significativo, porque no cabe en los 6 bits disponibles y, por lo tanto, el resultado almacenado es erróneo. El desbordamiento puede aparecer en todos los sistemas de representación numérica, pero se manifiesta de distintas maneras, según el sistema de representación. a Hay un tipo especial de desbordamiento que recibe el nombre de desbordamiento a cero y que aparece cuando un número de magnitud pequeña, pero diferente de cero, finalmente se acaba representando, a causa del error de representación, como cero. El desbordamiento a cero se produce cuando intentamos representar un número distinto de cero que es de menos magnitud que la precisión del formato de representación y la aproximación por truncamiento o redondeo utilizada hace que el número finalmente representado sea el cero. Esta situación es relevante por las implicaciones que comporta la reducción a cero de un número distinto de cero. Operaciones que a priori no deberían presentar ningún tipo de dificultad pueden llegar a ser irresolubles. Esto es especialmente crítico en el caso de las operaciones de división. Actividades 16. Determinad el rango y la precisión de los formatos x1x0,x−1x−2x−3 y x2x1x0,x−1x−2, donde xi es un dígito decimal. 17. Determinad si el número 925,4(10 se puede representar en los formatos indicados en la actividad 16. 18. Representad en el formato x1x0,x−1x−2, donde xi es un dígito decimal, los siguientes números: a) 10(10 b) 10,02(10 c) 03,1(10 d) 03,2(10 19. Determinad la cantidad de números que se pueden representar en el formato x2x1x0,x−1x−2x−3, donde xi es un dígito decimal. 20. Calculad el error de representación (con aproximación por truncamiento) que se comete cuando representamos en el formato x2x1x0,x−1x−2, donde xi es un dígito decimal, los siguientes números: a) 22,345(10 b) 45,89(10 c) 55,6356(10 d) 23,56(10 21. Elegid la representación hexadecimal que utilice el mínimo número de dígitos y que permita representar el número 16,25(10. ¿Cuál es el rango y la precisión de esta representación? 22. ¿Cuál es el menor número que hay que sumar a 8341(10 para que se produzca desbordamiento en una representación decimal (base 10) de cuatro dígitos? En inglés, el desbordamiento a cero recibe el nombre de underflow. 34 © FUOC • PID_00153515 Representación de la información numérica 2.2. Números naturales Los números naturales son los números sin parte fraccionaria y sin signo. Es decir, son los miembros de la sucesión: 0, 1, 2, 3, 4, 5, 6… Para la representación de estos números dentro de los computadores, nos tenemos que ajustar al número de bits disponibles en el formato de representación y en la base de representación. Habitualmente se trabaja en base 2 y, eventualmente, en base 16 para reducir la longitud de los números, aprovechando la correspondencia directa entre un Podéis ver los cambios de base entre b y bn del subapartado 1.3.3 de este módulo. dígito hexadecimal y un grupo de cuatro dígitos binarios. Al tratarse de números naturales, la precisión de la representación es 1, ya que no tenemos dígitos fraccionarios, mientras que el rango depende del número de dígitos disponibles. Los márgenes del rango los fijan la mayor n magnitud representable, que con n bits es 11 ··· 1(2 y equivale al valor decimal 2n − 1, y la menor magnitud representable, que es cero (cuando todos los bits son cero). El rango de representación de los números naturales en un formato de n bits es, en decimal, [0, 2n − 1], y su precisión es 1. El rango de representación se puede ampliar si aumentamos el número de bits de la representación. La ampliación del número de bits de un formato de representación recibe el nombre de extensión. La extensión de los números naturales representados en un formato de n bits a un formato de m bits, con m mayor que n, se consigue añadien- do, a la izquierda de la codificación, los ceros necesarios hasta completar los m bits del formato nuevo. La representación del número natural 10(10 en un formato de 5 bits es 01010(2. La extensión de esta codificación a un formato de 8 bits se consigue añadiendo ceros a la izquierda hasta completar los 8 bits del formato nuevo, con lo cual la nueva codificación será 00001010(2. Las operaciones de suma y de resta siguen las pautas expuestas anteriormente. Sólo hay que remarcar la posibilidad de que aparezca desbordamiento si el resultado de una operación de suma no cabe en el formato de representación, una situación que detectaremos por la existencia de transporte en la última Cambio de base del número 10(10 a base 2 Siguiendo el método basado en el teorema de la división entera: 10 = 5 · 2 + 0 15 = 2 · 2 + 1 12 = 1 · 2 + 0 11 = 0 · 2 + 1 10(10 = 1010(2 35 © FUOC • PID_00153515 Representación de la información numérica etapa de suma. El siguiente ejemplo de suma de números naturales en un formato de 6 bits pone de manifiesto esta situación: 1 − 1 Podéis ver la suma y la resta en los sistemas posicionales del subapartado 1.5 de este módulo. ← transportes 1 La suma de dos naturales 1 1 1 0 1 0 (2 0 1 0 1 0 1 (2 0 0 1 1 1 1 (2 ← resultado La suma de dos números naturales de n bits da lugar a un resultado que como máximo requiere n + 1 bits para su representación. ↑ desbordamiento La suma de estos valores numéricos produce desbordamiento, que podemos detectar porque hay un transporte en la última etapa de suma. Así pues, el resultado no cabe en el formato de 6 bits disponibles para la representación. El resto de los números naturales no puede dar lugar a desbordamiento. La resta de dos naturales La resta de números naturales no puede dar lugar a desbordamiento, porque debemos restar la magnitud pequeña de la grande, con lo cual el resultado será menor o igual al mayor de los dos operandos. Restar la magnitud grande de la magnitud pequeña no es una operación válida dentro del conjunto de los números naturales, porque el resultado debería ser un número con signo. El desbordamiento en la suma de dos números naturales se produce cuando tenemos un transporte en la última etapa de suma. La operación de resta de números naturales no puede dar lugar a desbordamiento. Las operaciones de multiplicación y división entera por potencias de la base de numeración se ajustan a los procedimientos ya descritos. La operación de división entera por una potencia de la base de numeración no puede dar lugar a desbordamiento, puesto que da como resultado dos números naturales (cociente y resto) que son menores que el dividendo. La multiplicación dará desbordamiento cuando el resultado supere el número de dígitos a disponibles en el formato. 2.3. Números enteros El conjunto de los números enteros es el conjunto de los números con signo y sin parte fraccionaria, incluyendo el cero: …−3, −2, −1, 0, +1, +2, +3… El elemento destacable respecto de los números naturales es la presencia de un signo que indica si la magnitud es positiva o negativa. Para incorporar la información adicional que supone la inclusión del signo en la representación de los valores numéricos dentro de los computadores, hay diferentes alternativas. En los siguientes subapartados, describimos las más utilizadas: signo y magnitud, complemento a 2 y exceso a M. Podéis ver la multiplicación y la división por potencias de la base de numeración en el subapartado 1.6 de este módulo. La división de dos naturales La operación de división sobre números naturales tiene que ser la división entera, puesto que los números naturales no tienen parte fraccionaria. 36 © FUOC • PID_00153515 Representación de la información numérica 2.3.1. Representación de enteros en signo y magnitud en base 2 Signo y magnitud es, probablemente, la manera más intuitiva de representar números con signo. En la representación con el formato de signo y magnitud de los números binarios con signo, el bit más significativo (MSB) se reserva para almacenar el signo y el resto de los bits se dejan para representar la magnitud del valor numérico. Un 1 en el dígito más significativo indica signo negativo, mientras que un 0 indica signo positivo. De esta manera, si la cadena de bits 101001(2 representa un valor numérico co- MSB y LSB MSB es la abreviación de most significant bit, es decir, el bit más significativo de la representación, que se corresponde con el dígito del extremo izquierdo. LSB es la abreviación de least significant bit, es decir, el bit menos significativo de la representación, que se corresponde con el dígito del extremo derecho. dificado en el sistema de signo y magnitud, sabremos que se trata de un valor negativo, puesto que el bit más significativo es 1. La magnitud representada será 01001(2, que en base 10 corresponde a 9(10. Consiguientemente, el número codificado en esta cadena de bits es el valor −9(10. Con n bits para la representación, un valor numérico entero codificado en signo y magnitud viene determinado por la cadena de bits xn−1xn−2…x1x0, donde xn−1 representa el signo y xn−2…x1x0, la magnitud. El bit más significativo (xn−1) representa un signo positivo cuando el valor sea 0 y un signo negativo cuando el valor sea 1. La magnitud a la que se hace referencia en esta representación es un valor entero, ya que tratamos sobre la representación de números enteros. Ahora bien, en este sistema de representación también es habitual codificar números con a parte fraccionaria, tal y como se explica más adelante. Representación en signo y magnitud Dentro del computador, la base de trabajo habitual es la base 2. Para representar el valor −12(10 en el sistema de signo y magnitud, con seis dígitos y base 2, deberemos convertir la magnitud 12(10 a base 2 (12(10 = 1100(2) y poner el bit más significativo de la representación (el bit de más a la izquierda) en 1. La representación será, por lo tanto, 101100(2. El valor +12(10 se representará en las mismas condiciones como 001100(2. Sólo cambia el valor del dígito más significativo. Los dígitos que codifican la magnitud no varían. Rango de representación en signo y magnitud y base 2 El formato de signo y magnitud es simétrico, es decir, una vez fijado un número de dígitos para la representación, se pueden representar tantos valores positivos como negativos. De esta manera, si disponemos de 4 bits para representar valores numéricos en signo y magnitud, destinaremos el dígito de más peso al signo. El resto contendrá la magnitud: a) Valores posibles de signo: 0→+ 1→− Cambio de base del número 12(10 a base 2 Siguiendo el método basado en el teorema de la división entera: 12 = 6 · 2 + 0 16 = 3 · 2 + 0 13 = 1 · 2 + 1 11 = 0 · 2 + 1 12(10 = 1100(2 37 © FUOC • PID_00153515 Representación de la información numérica b) Valores posibles para la magnitud: 000(2 = 0(10 100(2 = 4(10 001(2 = 1(10 101(2 = 5(10 010(2 = 2(10 110(2 = 6(10 011(2 = 3(10 111(2 = 7(10 Si combinamos signo y magnitud, podemos representar los valores enteros entre –7 y +7. Por lo tanto, el rango de representación es [−7, +7]. En general, en la representación de signo y magnitud en base 2, el rango de enteros representable con n bits es, en decimal: [−(2n−1 − 1), 2n−1 − 1] Si aplicamos esta expresión al caso de 4 bits, tenemos: [−(24−1 − 1), 24−1 − 1] = [−(23 − 1), 23 − 1] = [−7, +7] que es el rango al cual habíamos llegado de manera experimental. La precisión del formato de signo y magnitud para la representación de números enteros es 1, dado que podemos representar todos los números enteros del rango de representación. Si fuese necesario ampliar el rango de representación, deberíamos hacer una extensión del formato de signo y magnitud. La extensión del formato de signo y magnitud se consigue con el aumento del número de bits destinados a la representación de la magnitud, manteniendo el bit del extremo derecho para la codificación del signo. La conversión de los valores codificados en el formato original al nuevo formato extendido se consigue añadiendo los ceros necesarios a la izquierda de la magnitud y a la derecha del signo. La extensión de los números representados en signo y magnitud en un formato n bits a un formato de m bits, con m mayor que n, se consigue añadiendo, a la izquierda de la codificación de la magnitud, los ceros necesarios hasta completar los m bits del nuevo formato y manteniendo el bit del extremo derecho para la codificación del signo. Consiguientemente, el entero negativo 11010(2 codificado en signo y magnitud y 5 bits se puede extender a un formato de 8 bits añadiendo ceros a la derecha del signo, de manera que la codificación de este mismo número en el Ventajas del formato de signo y magnitud El formato de representación de signo y magnitud tiene ventajas a la hora de hacer unas operaciones determinadas; por ejemplo, facilita las operaciones de multiplicación. Para hacer una multiplicación, es posible operar por separado las magnitudes y los signos y juntar posteriormente los resultados obtenidos de manera independiente. © FUOC • PID_00153515 38 Representación de la información numérica formato nuevo sería 10001010(2. La extensión de números positivos se hace de la misma manera: la extensión a 8 bits de la codificación en signo y magnitud del entero positivo 01010(2 nos lleva al 00001010(2. 2.3.2. Suma y resta en signo y magnitud Aunque intuitivamente podría parecer el método más sencillo y directo de representar números con signo, el sistema de signo y magnitud presenta dificultades para llevar a cabo la operación aritmética más habitual: la suma. La suma de dos valores positivos o de dos valores negativos no presenta grandes problemas. Sencillamente, se identifica el signo de las magnitudes con el análisis del bit de más peso, se suman las magnitudes y se aplica el signo correspondiente al resultado. En la suma de las dos magnitudes, puede haber desbordamiento. Para sumar los números 101000(2 y 101010(2 codificados en signo y magnitud y 6 bits, seguiremos el siguiente procedimiento: Ahora bien, la suma de un valor positivo y un valor negativo es más compleja. En este caso, debemos analizar las magnitudes para saber cuál es la mayor y restar la menor magnitud de la mayor magnitud. Finalmente, debemos aplicar al resultado el signo de la mayor magnitud. Para sumar números 001000(2 y 101010(2 codificados en signo y magnitud y 6 bits, procederemos de la siguiente manera: Inconvenientes del formato de signo y magnitud Los inconvenientes principales del sistema de signo y magnitud son la complejidad de las operaciones de suma y resta y la existencia de dos representaciones para el valor 0: un 0 positivo cuando la magnitud es 0 y el signo también; y un 0 negativo, cuando la magnitud es 0 y el signo 1. 39 © FUOC • PID_00153515 En las operaciones de suma y resta de números codificados en signo y magnitud, se puede producir desbordamiento sólo si sumamos números del mismo signo o si restamos números de signo contrario. En estos casos, detectaremos el problema de desbordamiento en la operación de suma o resta de los módulos. El desbordamiento en la suma de dos números del mismo signo codificados en signo y magnitud se produce cuando aparece un transporte en la última etapa de suma. La suma de un número positivo y un número negativo no puede producir desbordamiento. Para sumar los números 101010(2 y el 111010(2, codificados en signo y magnitud y 6 bits, examinaremos en primer lugar los signos. Se trata de dos números negativos, ya que el bit de más peso de los dos es 1. Por lo tanto, procederemos a la suma de las magnitudes: 1 + 1 1 1 ← transportes 1 0 1 0 1 0 (2 1 1 0 1 0 (2 0 0 1 0 1 (2 ← resultado ↑ desbordamiento La suma de estos módulos en este formato provoca desbordamiento, ya que tenemos un transporte en la última etapa. Por lo tanto, la suma de estos dos números en signo y magnitud en este formato de 6 bits produce desbordamiento. Esto quiere decir que el resultado de la operación no cabe en el formato definido y, por lo tanto, no se puede representar. 2.3.3. Complemento a la base En la representación de complemento a la base, los valores positivos se representan de la misma manera que en signo y magnitud, es decir, un valor entero positivo X(b, se representa por: X(b = 0xn−2xn−3…x1x0 donde 0 indica signo positivo y xn−2… x1x0 es la magnitud. La representación en complemento a la base se diferencia de la representación en signo y magnitud en la manera de codificar las magnitudes negativas. La representación de un número negativo −X(b en complemento a la base es: −X(b = bn − |X(b| donde |X(b| es el valor absoluto de X(b. Representación de la información numérica 40 © FUOC • PID_00153515 Representación de la información numérica En el sistema de representación de complemento a la base, el rango de valores enteros que se puede representar con n dígitos es: [−bn−1, bn−1 − 1] Cuando se trabaja en base 2, el sistema de complemento a la base recibe el nombre de complemento a 2, indicado habitualmente por C2 o Ca2. Abreviamos complemento a 2 indistintamente con las expresiones C2 o Ca2. Representación en complemento a la base Si asumimos la base 10 y 6 dígitos para la codificación, podemos obtener la representación del valor −12(10 en complemento a la base, de la siguiente manera: 106 − 12(10 = 1000000(10 − 12 = 999988(10 El valor −12(10 se representa como el 999988(10 en complemento a la base y 6 dígitos. 2.3.4. Representación en complemento a 2 El sistema de complemento a 2, abreviado habitualmente por Ca2 o C2, es el caso particular de representación en complemento a la base en la cual la base es 2. Actualmente, el Ca2 es el sistema más utilizado para representar números enteros en los computadores. Las ventajas que presenta respecto de la representación en signo y magnitud son, como se muestra más adelante, la existencia de una codificación única para el cero y la simplificación de las operaciones de suma y resta. El formato de complemento a 2 es un sistema de numeración para representar números con signo en la base 2. En complemento a 2 se representan, por lo tanto, números positivos y números negativos. Los números positivos en Ca2 se codifican de la misma manera que en signo y magnitud: el bit del extremo izquierdo es 0, para indicar signo positivo, y el resto contiene la magnitud. La codificación de un número negativo X en Ca2 se obtiene a partir de la operación 2n − |X| en base 2, donde |X| es el valor absoluto de X. Como vemos, debemos conocer el número n de bits para encontrar la codificación. a Codificación de números negativos en Ca2 Para encontrar la codificación en Ca2 y 6 bits del valor −11010(2, haremos la siguiente operación: 26 −⏐X⏐ = 1000000(2 −11010(2 = 100110(2 1 0 0 0 0 1 1 1 1 1 1 1 0 0 1 0 0 1 − 0 0 (2 1 0 (2 1 0 (2 Así pues, la codificación en Ca2 y 6 bits del valor −11010(2 es 100110(2. Ventajas del formato de Ca2 La ventajas principales del Ca2 son dos: 1) Una codificación única para el cero. 2) Simplicidad en las operaciones de suma y resta. Inconvenientes del formato de Ca2 Sin que afecte a la eficiencia dentro de los computadores, los valores de las magnitudes negativas codificadas en Ca2 son más difíciles de reconocer para nosotros. 41 © FUOC • PID_00153515 Representación de la información numérica La codificación del valor +11010(2 en Ca2 coincide con la codificación en signo y magnitud. Tendríamos un 0 para el signo y a continuación 5 bits con la magnitud: el valor +11010(2 se codifica en Ca2 como 011010(2. Para encontrar la codificación en Ca2 y 8 bits del valor −11010(2, haremos la siguiente operación: 28 − |X| = 100000000(2 − 11010(2 = 11100110(2. 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 1 1 1 0 0 1 − 0 0 (2 1 0 (2 1 0 (2 Rango de representación en Ca2 La siguiente tabla muestra el conjunto de valores enteros representables con 4 bits en signo y magnitud y en complemento a 2 y su correspondencia: Decimal Binario Signo y magnitud Ca2 +7 +111 0111 0111 +6 +110 0110 0110 +5 +101 0101 0101 +4 +100 0100 0100 +3 +011 0011 0011 +2 +010 0010 0010 +1 +001 0001 0001 0 000 −1 −001 1001 1111 −2 −010 1010 1110 −3 −011 1011 1101 −4 −100 1100 1100 −5 −101 1101 1011 −6 −110 1110 1010 −7 −111 1111 1001 −8 −1000 No es representable 1000 0000 1000 0000 En la tabla se muestra que el rango de valores enteros representables en Ca2 y 4 bits es [−8 , +7] en decimal. En general, el rango de valores enteros que se puede representar con n bits en el sistema de complemento a 2 es, en decimal: [−2n−1, 2n−1 − 1] En la tabla… … podemos ver que la codificación de los números positivos coincide en Ca2 y signo y magnitud y que, por lo tanto, el rango de representación de los positivos es el mismo en los dos sistemas. En cambio, en Ca2 podemos representar un número negativo más que en signo y magnitud. Esta asimetría reside en el hecho de que en Ca2 tenemos una representación única del cero. Observemos que en signo y magnitud tenemos dos codificaciones para el cero: 0000 y 1000. 42 © FUOC • PID_00153515 Representación de la información numérica Si aplicamos esta expresión al caso de 4 bits: [−24−1, 24−1 − 1] = [−23, 23 − 1] = [−8 + 7] que coincide con el rango de valores enteros representados en la tabla anterior. Se debe analizar con detalle el cambio que comporta en la representación de los valores numéricos el aumento del número de bits de una codificación en Ca2, para ampliar el rango de representación o adecuar la representación a un formato con más bits. La codificación de los números positivos en Ca2 coincide con la codificación de los números positivos en signo y magnitud. Por lo tanto, la extensión de los números positivos en Ca2 a un formato con más bits se consigue de la misma manera que en signo y magnitud: con la adición a la izquierda de tantos a ceros como sea necesario. Para establecer el procedimiento que se debe seguir con los números negativos, tomamos la representación de un entero, el −10(10, y analizamos el cambio. Para encontrar la codificación en Ca2 y 5 bits de este número hacemos el cálculo siguiente: 25−⏐−10(10⏐ = 32(10 − 10(10 = 22(10. La representación en binario del 22(10 es la codificación en Ca2 del número entero −10(10, es decir, 10110(2. La codificación en Ca2 y 8 bits de este mismo valor, el −10(10, la encontrare- Cambio de base del número 22(10 a base 2 Siguiendo el método basado en el teorema de la división entera: 22 = 11 · 2 + 0 11 = 5 · 2 + 1 15 = 2 · 2 + 1 12 = 1 · 2 + 0 11 = 0 · 2 + 1 22(10 = 10110(2 mos haciendo el mismo cálculo: 28 − ⏐−10(10⏐ = 256(10 − 10(10 = 246(10, que, si hacemos el cambio a base 2, nos da 11110110(2. La representación del −10(10 en Ca2 y 5 bits es 10110(2, y la representación en Ca2 y 8 bits es 11110110(2. Para obtener esta segunda representación a partir de la primera, sólo debemos añadir 3 unos a la izquierda. Por lo tanto, la extensión de la codificación en Ca2 de un valor negativo se consigue con la adición de 1 a la izquierda, mientras que la extensión de la codificación en Ca2 de un valor positivo se consigue añadiéndole ceros. Observemos que en los dos casos, los bits que se añaden coinciden con el valor: ceros para los positivos y unos para los negativos. Por lo tanto, conseguiremos la extensión del formato copiando el bit a la izquierda tantas veces como sea necesario. La extensión de los números representados en complemento a 2 en un formato n bits a un formato de m bits, con m mayor que n, se consigue copiando a la izquierda el bit de signo tantas veces como sea necesario para completar los m bits del formato nuevo. Este proceso recibe el nombre de extensión del signo. Cambio de base del número 246(10 a base 2 Siguiendo el método basado en el teorema de la división entera: 246 = 123 · 2 + 0 123 = 61 · 2 + 1 261 = 30 · 2 + 1 230 = 15 · 2 + 0 215 = 7·2+1 247 = 3·2+1 243 = 1·2+1 241 = 0·2+1 246(10 = 11110110(2 43 © FUOC • PID_00153515 Representación de la información numérica Por consiguiente, el entero negativo 11010(2 codificado en Ca2 y 5 bits se puede extender a un formato de 8 bits copiando el bit de signo a la izquierda de la representación hasta llegar a los 8 bits de la nueva representación. La codificación de este mismo número en el formato nuevo sería 11111010(2. La extensión de números positivos se hace de la misma manera. La extensión a 8 bits de la codificación en Ca2 01010(2 nos lleva a 00001010(2,, que representa el mismo número. 2.3.5. Cambio de signo en complemento a 2 Para cambiar el signo de un valor numérico codificado en complemento a 2, seguimos el siguiente proceso: 1) Obtenemos el complemento bit a bit de la representación en Ca2. 2) Sumamos 1 al bit menos significativo de la representación. El complemento de un dígito xi es xi = (b − 1) − xi. En el caso de la base 2, el complemento del dígito 0 es el 1, como vemos si aplicamos la expresión anterior al caso de la base 2: (2 − 1) − 0 = 1; el complemento del dígito 1 es el 0, puesto que (2 − 1) − 1 = 0. Cambio de signo en complemento a 2 Para hacer el cambio de signo del valor numérico 11000110(2 (que, si seguimos el procedimiento explicado en el apartado siguiente, veríamos que se trata del −58(10), que está codificado en complemento a 2 y 8 dígitos, hacemos la siguiente operación: 1 1 0 0 0 1 1 0 (2 ← valor numérico inicial (2 ← complemento bit a bit de la expresión inicial 1 0 0 1 1 1 0 0 1 + ← sumamos 1 al bit menos significativo del formato 1 0 0 1 1 1 0 1 0 (2 De esta operación resulta el 00111010(2, que codifica la misma magnitud, pero con signo positivo. Una manera alternativa y, eventualmente, más rápida de hacer un cambio de signo es la que se explica a continuación: 1) Analizar el número de derecha a izquierda. 2) Mantener los bits hasta el primer 1 que se encuentre (incluyéndolo). 3) Hacer el complemento del resto de los bits. Cambio de signo en complemento a 2 Para hacer el cambio de signo del valor numérico 11000110(2 (que, si seguimos el procedimiento explicado en el apartado siguiente, veríamos que se trata del −58(10), que está codificado en complemento a 2 y 8 dígitos, seguiremos el siguiente procedimiento: 11000110 ^ se mantienen los bits hasta aquí (primer 1 que encontramos, incluido éste). 10 ^ complementar los bits a partir de este punto. 001110 Complemento bit a bit Se entiende por complemento bit a bit la sustitución de cada dígito binario por su complementario. Cuando trabajamos en base 2, el complementario del dígito 0 es el 1 y el complementario del dígito 1 es el 0. 44 © FUOC • PID_00153515 De esta operación resulta el 00111010(2, que codifica la misma magnitud, pero con signo positivo. Para hacer el cambio de signo del valor numérico 00011110(2 (que, si seguimos el procedimiento explicado en el apartado siguiente, veríamos que se trata del +30(10), que está codificado en formato de complemento a 2 con 8 dígitos, seguiremos el siguiente procedimiento: 00011110 ^ se mantienen los bits hasta aquí (primer 1 que encontramos, incluido éste). 10 ^ complementar los bits a partir de este punto. 111000 Con esta operación nos queda el 11100010 (−30(10), que codifica la misma magnitud, pero con signo negativo. Una alternativa a la operación 2n − |X(2| para encontrar la representación en Ca2 de un valor negativo es aplicar un cambio de signo a la representación en Ca2 de la magnitud positiva. La codificación en Ca2 de las magnitudes negativas se puede conseguir a partir de un cambio de signo en la codificación de la magnitud positiva en Ca2. La operación es reversible, es decir, si aplicamos un cambio de signo a la codificación en Ca2 de la magnitud negativa, encontramos la codificación en Ca2 de una magnitud positiva. a 2.3.6. Magnitud de los números en complemento a 2 Conocer la magnitud de un número positivo en Ca2 no presenta dificultades. La codificación de los valores positivos en Ca2 es la misma que en signo y magnitud. Por lo tanto, separamos el bit de más peso y el resto de los bits son directamente la magnitud. Para conocer la magnitud en base 10 del número 0101(2 codificado en Ca2, separamos el bit de más peso y hacemos un cambio de base del resto de los bits aplicando el TFN: 0101(2 → 0 101 101(2 = 1 · 22 + 0 · 21 + 1 · 20 = 5(10 Por lo tanto, la cadena de bits 0101 codifica el valor +5(10 si la interpretamos como un número en Ca2. Para encontrar la magnitud de un número negativo codificado en Ca2, debemos proceder de manera distinta. Disponemos de dos alternativas: 1) Partir de la expresión 2n − |X|, que es la que hemos utilizado para definir la codificación de los números negativos en Ca2. A partir de esta expresión, y si Representación de la información numérica 45 © FUOC • PID_00153515 aplicamos el TFN, podemos derivar otra que permite conocer con facilidad la magnitud decimal de un valor numérico negativo expresado en Ca2. Un método para conocer la magnitud de un valor negativo codificado en Ca2 es expresar según la base la representación en Ca2 del valor numérico (siguiendo el TFN), pero asumiendo que el bit de signo es un dígito con signo negativo. Al hacer las operaciones en base 10, obtenemos la representación en decimal del valor numérico. Obtención de la magnitud decimal de un valor negativo codificado en Ca2 por aplicación del TFN Para conocer el valor decimal que corresponde al valor 10001010(2 que está expresado en el sistema de complemento a 2, podemos hacer el cálculo siguiente: 10001010(2 = −1 · 27 + 0 · 26 + 0 · 25 + 0 · 24 + 1 · 23 + 0 · 22 + 1 · 21 + 0 · 20 = = −128 + 10 = −118(10 10001010(2 = −118(10 2) Aplicar un cambio de signo a la representación en Ca2 del valor negativo: Un método alternativo para conocer la magnitud de un valor negativo codificado en Ca2 es aplicar un cambio de signo a la representación en Ca2 del valor negativo, con lo cual se obtiene la codificación en Ca2 de la magnitud positiva. Para conocer el valor de la magnitud en base 10, sólo hay que hacer un cambio de base aplicando el TFN. Obtención de la magnitud decimal de un valor negativo codificado en Ca2 por cambio de signo Para conocer el valor decimal que corresponde al valor 10001010(2 que está expresado en el sistema de complemento a 2, podemos hacer el siguiente cálculo: 1) Cambio de signo del número en Ca2: 1 0 0 0 1 0 1 0 (2 ← transportes 1 0 1 1 1 0 1 0 1 + ← valor numérico inicial (2 1 0 1 1 1 0 1 1 0 ← complemento bit a bit de la expresión inicial ← sumamos 1 al bit menos significativo del formato (2 2) Hacer un cambio de base con el método basado en el TFN: 01110110(2 = 0 · 27 + 1 · 26 + 1 · 25 + 1 · 24 + 0 · 23 + 1 · 22 + 1 · 21 + 0 · 20 = +118(10 La magnitud positiva 01110110(2 en Ca2 codifica el valor decimal +118(10. Por lo tanto, el valor decimal del número 10001010(2 codificado en Ca2 es –118(10. Representación de la información numérica 46 © FUOC • PID_00153515 Representación de la información numérica 2.3.7. Suma en complemento a 2 El mecanismo de suma en Ca2 es el mismo que el mecanismo empleado en cualquier otro sistema posicional. Nos será de utilidad reconocer las condiciones en las que se produce desbordamiento en Ca2 para identificar resultados erróneos en las operaciones de suma. Recordemos que el desbordamiento se produce cuando el resultado de una operación no cabe en el formato disponible. Por lo tanto, cuando hacemos operaciones de suma debemos tener muy presente el formato de representación de los números y del resultado. a El desbordamiento en la suma El desbordamiento en la suma puede aparecer porque la suma de dos números enteros de n bits puede dar un resultado de hasta n + 1 bits. Podéis ver la suma y la resta en los sistemas posicionales en el subapartado 1.5 de este módulo. Suma de dos valores positivos en Ca2 Al sumar dos números positivos, obtendremos un resultado correcto siempre que el valor de la suma no supere el rango de representación. En este caso, obtendremos un signo positivo (bit de más peso a 0) y una magnitud que corresponderá a la suma de las magnitudes de los operandos. Consideramos un formato de 6 bits para representar números enteros en Ca2 y hacemos la suma siguiente: + 0 0 1 0 1 0 (2 → 0 0 0 1 0 1 (2 → 0 0 1 1 1 1 (2 → +10 (10 + +5 (10 +15 (10 (resultado correcto) Sumamos dos valores positivos y obtenemos una magnitud positiva. Por lo tanto, el resultado es correcto. Ahora bien, si el resultado de la suma supera el rango de representación, no se podrá representar en el formato definido. Esta situación la detectaremos porque la suma de dos valores positivos dará lugar a un resultado negativo (bit de más peso a 1). Con el mismo formato de 6 bits para representar números enteros en Ca2, consideramos la siguiente operación: 1 1 1 1 0 1 0 1 1 0 ← transportes → (2 +22 (10 + 0 0 1 1 1 1 (2 → + +15 (10 1 0 0 1 0 1 (2 → −27 (10 (desbordamiento) En este caso, hemos sumado dos valores positivos y obtenemos una magnitud negativa. El resultado no es correcto. El rango de representación de este formato es [−26, +26−1 − 1] = [−32, +31], mientras que el valor de la magnitud del resultado debería ser 37(10 (22(10 + 15(10 = 37(10), que queda fuera de este rango. Podemos encontrar la correspondencia entre los números en Ca2 y los valores decimales por aplicación de cualquiera de los dos métodos expuestos en el subapartado 2.3.6. 47 © FUOC • PID_00153515 Representación de la información numérica En esta suma se ha producido desbordamiento, porque el resultado no cabe en el formato definido. Detectaremos el desbordamiento en la suma de dos valores positivos codificados en Ca2 cuando el resultado sea negativo. Suma de dos valores negativos en Ca2 De la misma manera que en el caso anterior, la suma de dos valores negativos en Ca2 dará un resultado correcto siempre que el resultado no supere el rango de representación del formato definido. Consideramos de nuevo un formato de 6 bits para la representación de números enteros en Ca2 y hacemos la operación siguiente: 1 ← transportes 1 1 1 0 1 0 (2 → 1 1 0 1 0 1 (2 → 1 1 0 1 1 1 1 (2 → 1 + −6 + (10 −11 (10 −17 (10 (resultado correcto) Al hacer la operación, obtenemos el resultado correcto, ya que no se supera el rango de representación que es [−26, +26−1 − 1] = [−32, +31]. Observemos que aparece un transporte en la etapa de más peso. Este transporte no indica desbordamiento y se debe despreciar. Analizamos ahora el resultado de la operación siguiente: 1 + 1 1 1 ← transportes 1 0 0 1 1 0 (2 → 1 0 1 1 1 1 (2 → 1 0 1 0 1 0 1 (2 → −26 (10 + −17 (10 +21 (10 (desbordamiento) Como en el caso anterior, hay un transporte en la última etapa que se debe despreciar, pero el resultado es positivo cuando hemos sumado dos valores negativos. Por lo tanto, hay desbordamiento. Es importante recordar que el transporte que se puede producir en la última etapa de una suma de números codificados en Ca2 no indica desbordamiento y hay que despreciarlo. a El desbordamiento en una suma de valores en Ca2 se puede dar cuando sumamos dos números positivos o dos números negativos, y lo detectaremos porque el resultado es de signo contrario a los operandos. a Podemos encontrar la correspondencia entre los números en Ca2 y los valores decimales si aplicamos cualquiera de los dos métodos expuestos en el subapartado 2.3.6 de este módulo. 48 © FUOC • PID_00153515 Representación de la información numérica Detectaremos el desbordamiento en la suma de dos valores negativos codificados en Ca2 cuando el resultado es positivo. El transporte de la última etapa no indica desbordamiento y hay que despreciarlo en todos los casos. Suma de un valor positivo y un valor negativo en Ca2 El resultado de la suma de un valor positivo y un valor negativo en Ca2 siempre será correcto, porque el resultado de la suma siempre cabrá en el formato definido (ya que se tratará de un valor de menor magnitud que el mayor de los dos operandos). Con el formato de 6 bits para la representación de números enteros en Ca2, hacemos las operaciones siguientes de suma: ← transportes 1 1 + 1 1 1 0 1 0 (2 → −6 (10 1 0 0 1 1 0 (2 → −26 (10 0 1 0 1 0 1 (2 → + +21 (10 + 0 1 0 0 0 1 (2 → + +17 (10 1 0 0 1 1 1 1 (2 → 1 1 0 1 1 1 (2 → −9 (10 +15 (10 (resultado correcto) (resultado correcto) El resultado es correcto en los dos casos. Observemos que en la suma de la izquierda aparece un transporte a la etapa de más peso, que no indica desbordamiento y que hay que despreciar. La suma de un número positivo y un número negativo, si los dos están codificados en Ca2, no puede producir desbordamiento. El transporte que se puede producir en la última etapa no indica desbordamiento y hay que despreciarlo en todos los casos. 2.3.8. Resta en complemento a 2 Cuando trabajamos con números codificados en Ca2, la operación de resta no se hace directamente. El procedimiento habitual es aplicar un cambio de signo al sustraendo (operando que queremos restar) y a continuación hacer una operación de suma. Sumamos el minuendo con el sustraendo al que hemos cambiado el signo. La operación de resta en Ca2 se reduce a una operación de suma una vez se ha cambiado el signo del sustraendo. Podéis ver la correspondencia entre los números en Ca2 y los valores decimales aplicando cualquiera de los dos métodos expuestos en el subapartado 2.3.6 de este módulo. 49 © FUOC • PID_00153515 Representación de la información numérica La resta 011010(2 − 001011(2 (26(10 − 11(10) nos servirá de ejemplo para ilustrar el procedimiento: 1) Aplicamos un cambio de signo al sustraendo: 001011(2 → complemento bit a bit → 110100(2 Sumamos 1 al bit menos significativo: 1 1 0 1 0 0 (2 1 (2 1 1 0 1 0 1 (2 + 2) Hacemos la operación de suma: 1 ← transportes 0 1 1 0 1 0 (2 → 1 1 0 1 0 1 (2 → 1 0 0 1 1 1 1 (2 → 1 + Podéis ver la correspondencia entre los números en Ca2 y los valores decimales aplicando cualquiera de los dos métodos expuestos en el subapartado 2.3.6 de este módulo. +26 (10 + −11 (10 +15 (10 (resultado correcto) El resultado es correcto. El transporte de la última etapa hay que despreciarlo y no se produce desbordamiento. Recordemos que la suma de un número po- a sitivo y un número negativo no puede dar lugar a desbordamiento. 2.3.9. Multiplicación por 2k de números en complemento a 2 Como hemos visto, multiplicar o dividir por 2k números representados en sistemas de numeración posicionales de base fija igual a 2 es equivalente a Podéis ver la multiplicación y la división por potencias de la base de numeración en el subapartado 1.6 de este módulo. desplazar la coma fraccionaria k posiciones a la derecha o a la izquierda, respectivamente. En la representación de números enteros en Ca2, la parte fraccionaria es nula. Podemos interpretar que la coma está a la derecha del dígito de menos peso de la representación y es inamovible. Ahora bien, podemos conseguir el mismo efecto de desplazamiento de la coma si desplazamos los bits a la derecha o a la izquierda según corresponda. De esta manera, para multiplicar el número 000101(2 en Ca2 y 6 bits por 22, desplazamos los bits dos posiciones a la izquierda y completamos a la derecha con los ceros necesarios (en este caso, dos): 000101(2 · 22 = 010100(2 (en decimal, +5(10 · 22 = +20(10) Por aplicación del TFN 000101(2 = 1 · 22 + 1 · 20 = 5(10 010100(2 = 1 · 24 + 1 · 22 = 20(10 50 © FUOC • PID_00153515 Si aplicamos este procedimiento, obtenemos el resultado correcto. También se obtiene el resultado correcto en el caso de números negativos: 111000(2 · 22 = 10000(2 (en decimal, −8(10 · 22 = −32(10 ) Este procedimiento para obtener de manera sencilla el resultado de este tipo de operación es aplicable a todos los números representados en Ca2. El resultado de multiplicar por 2k un número en Ca2 se consigue desplazando los bits k posiciones a la izquierda y añadiendo a la derecha los 0 necesarios para completar los n bits del formato. Sin embargo, esta operación produce desbordamiento cuando el resultado no cabe en los n bits del formato en Ca2. Las operaciones siguientes provocan desbordamiento y, consiguientemente, un resultado erróneo: 000101(2 · 24 = 010000(2 (en decimal, +5(10 · 24 = +16(10) 111000(2 · 24 = 00000(2 (en decimal, −8(10 · 24 = 0(10 ) El desbordamiento se produce cuando se pierden los dígitos significativos al hacer el desplazamiento. Observemos que los dígitos significativos son los 1 en el caso de los positivos y los 0 en el caso de los negativos. Se produce desbordamiento al multiplicar un número en Ca2 por 2k cuando se pierden uno o más bits significativos al desplazar los bits k posiciones. En números positivos, se dará cuando se pierda algún 1 en el desplazamiento, mientras que en los números negativos se dará cuando se pierda algún 0. 2.3.10. Representación en exceso a M El exceso a M es un tipo de representación de números enteros muy utilizado para codificar el valor del exponente cuando se trabaja en notación científica. La estrategia que sigue este sistema de representación es hacer un traslado del conjunto de números que hay que representar, de manera que el valor más negativo esté codificado por el valor cero. a Representación de la información numérica Las magnitudes decimales Las magnitudes decimales son: 111000(2 = = −1 · 25 + 1 · 24 + 1 · 23 = −8(10 100000(2 = −1 · 25 = −32(10 © FUOC • PID_00153515 51 El resto de los valores se codifican a partir del 0 en orden ascendente. La figura siguiente muestra gráficamente esta estrategia: Lo que se consigue de esta manera es transformar el conjunto de valores enteros representables a un conjunto de números naturales. El mecanismo que permite esta transformación es la aplicación de un desplazamiento. Consideremos el intervalo [−5, +5]. Para desplazar este rango de valores enteros a un conjunto de valores naturales, sólo debemos sumar 5 a cada número entero del intervalo. De esta manera, los números pasan a estar en el intervalo [0, 10]. Con este desplazamiento, el valor entero −5 da lugar al valor natural 0, ya que −5 + 5 = 0; el valor +2 da lugar al valor natural 7, ya que 2 + 5 = 7; etc. El intervalo [a, b] de números enteros se puede desplazar al intervalo de números naturales [0, b + a] si sumamos −a a cada entero del intervalo [a, b]. El desplazamiento de un intervalo de valores enteros a un intervalo de valores naturales permite utilizar las técnicas de representación de números naturales para codificarlos. Este tipo de estrategia se denomina representación en exceso a M, donde M es el desplazamiento que se aplica al intervalo de enteros que se quiere codificar. La representación en exceso a M de un número entero X se obtiene si sumamos el desplazamiento M al valor numérico X. Consiguientemente, encontraremos el valor de un número codificado en exceso a M si restamos M a la codificación. A modo de ejemplo, podemos decir que en una representación en exceso a 10 el número entero −4 se representa con el número natural 6, y que el 0 se representa con el número 10. Puesto que dentro del computador la información se codifica en binario, los números naturales utilizados en la representación en exceso a M se codifican a en binario. Representación de la información numérica 52 © FUOC • PID_00153515 Representación de la información numérica Representación en exceso a M Para representar el valor –6(10 en exceso a 7 y 4 bits, procederemos de la siguiente manera: 1) Sumamos el desplazamiento para encontrar la codificación en decimal –6(10 + 7(10 = 1(10. 2) Codificamos en binario y 4 bits el número obtenido 1(10 = 0001(2. El valor –6(10 se codifica en exceso a 7 y 4 bits como 0001. Para representar el valor +3(10 en exceso a 7 y 4 bits, procederemos de la siguiente manera: 1) Sumamos el desplazamiento para encontrar la codificación en decimal 3(10 + 7(10 = 10(10. 2) Codificamos en binario y 4 bits el número obtenido 10(10 = 1010(2. El valor +3(10 se codifica en exceso a 7 y 4 bits como 1010. Para saber qué valor representa la cadena de bits 1101 que está codificada en exceso a 7 y 4 bits, procederemos de la siguiente manera: 1) Hacemos un cambio de base para encontrar la codificación en decimal 1101(2 = 13(10. 2) Restamos el desplazamiento para encontrar el valor codificado 13(10 – 7(10 = +6(10. El valor que representa la cadena de bits 1101 codificada en exceso a 7 y 4 bits es +6(10. Para saber qué valor representa la cadena de bits 0101 que está codificada en exceso a 7 y 4 bits, procederemos de la siguiente manera: 1) Hacemos un cambio de base para encontrar la codificación en decimal 0101(2 = 5(10. 2) Restamos el desplazamiento para encontrar el valor codificado 5(10 – 7(10 = –2(10. Rango de representación en exceso a M Consideremos un formato de 2 dígitos decimales para la representación de números enteros en exceso a 3. El menor número que podremos representar será el número X, que hace cierta la ecuación X(10 + 3(10 = 0(10, es decir, el valor −3(10. De una manera semejante, el mayor número que se puede representar es el que Recordemos que… … la representación en exceso a M desplaza el número más negativo que se podrá representar en el valor 0. hace que X(10 + 3(10 = 99(10, es decir, el +96(10. En exceso a 3, el valor −3(10 se codifica como 0(10 y el valor +96(10 como 99(10, que corresponden a los límites del intervalo de números naturales representables con 2 dígitos decimales. Por lo tanto, en el formato definido el rango de valores enteros que podemos representar en exceso a 3 es el [−3(10, +96(10], donde podemos ver que la magnitud del valor más negativo que se puede representar, (−3(10), coincide con la magnitud del desplazamiento (3(10). El rango de valores enteros que se puede representar en exceso a M y n bits es: [−M, 2n − 1 − M] El valor que tomará M dependerá de la aplicación en la que se utilicen los enteros codificados en el sistema de exceso. Ahora bien, es habitual que M tome el valor 2n−1, en el que n es el número de bits disponibles para la representación. De esta manera, se dispone de un rango equilibrado. El rango de representación en exceso a M cuando M toma el valor 2n−1 es el mismo que el rango en complemento a 2: [−2n−1, 2n−1 − 1] Recordemos que… … el rango de representación de números naturales con n bits es [0, 2n − 1]. El rango en exceso a –M se obtiene si sumamos el desplazamiento M al intervalo [0 – M, 2n – 1 – M]. Otros valores habituales del exceso También es habitual encontrar sistemas de representación en exceso a M que utilicen M = 2n−1 − 1. El sistema más conocido que lo utiliza es el estándar IEEE754. 53 © FUOC • PID_00153515 Representación de la información numérica Este valor de M también permite diferenciar fácilmente los números negativos de los positivos: todos los negativos empiezan por 0 y todos los positivos (incluido el 0), por 1. A pesar de todo, este bit inicial no se considera un bit de signo. Si no se dice explícitamente otra cosa, en este curso asumiremos siem- a pre que M = 2n−1. Para conocer la manera en la que cambia la representación en exceso a M con la ampliación del número de bits del formato, debemos establecer cómo afecta el cambio al valor de M. Hay dos escenarios posibles: 1) Que se mantenga el valor de M, a pesar del cambio en el número de bits del formato de representación. 2) Que se ajuste el valor de M al formato nuevo, que es el caso más habitual. El primer caso es el más simple. Para convertir la codificación en exceso a M de un formato de n bits a un formato n + p bits, sólo hay que añadir p ceros a la izquierda. Por ejemplo, en exceso a 8 y 4 bits, el −2(10 se codifica como 8(10 + (−2(10) = +6(10 = 0110(2. Si se mantiene el valor de M, la extensión de esta codificación a un formato de 8 bits se consigue con la adición de 0 a la izquierda, con lo cual se obtiene 00000110(2. La extensión a n + p bits de la codificación en exceso a M de n bits manteniendo fijo el valor de M se consigue con la adición de p ceros a la izquierda de la codificación. Este procedimiento es válido independientemente del valor de M. El segundo caso es el más habitual y comporta cambios importantes en la codificación. En la tabla siguiente, se muestra cómo cambian las codificaciones de números en exceso a 4 y 3 bits con la ampliación del formato y el cambio de M según el número de bits. Se asume que M toma el valor 2n−1, en el que n se ajusta al número de bits, y se marcan en negrita los bits que diferencian la nueva codificación de la inicial en exceso a 4: Decimal Binario Exceso a 4 con 3 bits Exceso a 8 con 4 bits Exceso a 16 con 5 bits Exceso a 32 con 6 bits −4 −100 000 0100 01100 011100 −3 −011 001 0101 01101 011101 −2 −010 010 0110 01110 011110 −1 −001 011 0111 01111 011111 0 000 100 1000 10000 100000 +1 +001 101 1001 10001 100001 +2 +010 110 1010 10010 100010 +3 +011 111 1011 10011 100011 54 © FUOC • PID_00153515 A partir de esta tabla, podemos extrapolar una conclusión. La extensión a n + p bits de la codificación en exceso a M de n bits, en la que M toma el valor M = 2n+p−1, se consigue añadiendo p unos puntos a la derecha del dígito de más peso para el caso de los números negativos y añadiendo p ceros a la derecha del dígito de más peso para el caso de los números positivos, incluido el 0. Este procedimiento es válido para M = 2n+p−1, donde n + p es el número de bits. La representación en exceso a M se utiliza para codificar de manera exacta los números enteros contenidos en el intervalo que determina el rango de representación. Por lo tanto, la precisión es 1. a La precisión de una representación en exceso a M de números enteros es 1. Suma y resta en exceso a M La suma y la resta en exceso a M presenta un problema: la codificación en exceso a M de todo valor numérico comporta un desplazamiento de magnitud M. Tomamos, por ejemplo, los números 10(10 y 14(10. La suma de estos números es 10(10 + 14(10 = 24(10. La codificación decimal en exceso a 16 del número 24(10 se obtiene si sumamos el desplazamiento: 24(10 + 16(10 = 40(10. Ahora bien, cuando trabajamos con números codificados en exceso a M nos sería útil conseguir el resultado correcto de la suma a partir de las codificaciones. Tomamos ahora las codificaciones decimales en exceso a 16 de los mismos números, que son, respectivamente, 26(10 para el 10(10 (que se obtiene de 10(10 + 16(10 = 26(10) y 30(10 para el 14(10 (que se obtiene de 14(10 + 16(10 = 30(10). La suma de las codificaciones es: 26(10 + 30(10 = (10(10 + 16(10) + (14(10 + 16(10) = = 10(10 + 14(10 + 16(10 + 16(10 = 10(10 + 14(10 + (2 × 16(10) = 56(10. Los resultados obtenidos son distintos: 40(10 en el primer caso y 56(10 en el segundo. Vemos que cuando sumamos las codificaciones sumamos dos veces el desplazamiento, que en este caso es 16. Por lo tanto, para obtener la codificación correcta del resultado tenemos que restar el desplazamiento: 56(10 − 16(10 = 40(10. Es decir, al sumar las codificaciones sumamos el exceso dos veces. Las codificaciones en exceso a M de dos valores X e Y son, respectivamente, X + M e Representación de la información numérica 55 © FUOC • PID_00153515 Y + M. Al hacer la suma de las codificaciones, sumamos dos veces el despla- zamiento: (X + M) + (Y + M) = X + Y + 2 · M El resultado que obtenemos es X + Y + 2 · M, cuando en realidad el resultado debería ser X + Y + M. Obtendremos la codificación correcta si restamos M al resultado de la suma. El resultado correcto en la suma de dos valores numéricos codificados en exceso a M se obtiene si restamos el desplazamiento M al resultado. Suma de números codificados en exceso a M Para sumar los números binarios 00001100(2 y 11001111(2 codificados en exceso a 27 (27(10 = 10000000(2) y 8 bits, haremos las operaciones: + − 1 1 ← transportes 0 1 1 0 1 1 0 0 0 0 0 1 1 1 1 1 1 0 0 1 1 0 1 1 1 1 0 1 0 1 0 0 0 1 0 1 1 0 0 0 0 0 1 0 1 1 0 1 (2 (2 (2 (2 (2 (2 En el caso de la resta, encontramos una dificultad semejante. La codificación en exceso a M de los valores numéricos X e Y son, respectivamente, X + M e Y + M. El resto de estas codificaciones hace que desaparezca el desplazamiento: (X + M) − (Y + M) = X + M − Y − M = X − Y + M − M = X − Y La codificación correcta del resultado es X − Y + M. Conseguiremos esta codificación si sumamos M al resultado de la resta. El resultado correcto en la resta de dos valores numéricos codificados en exceso a M se obtiene si sumamos el desplazamiento M al resultado. Resta de números codificados en exceso a M Para restar los números binarios 00001100(2 y 10000100(2, codificados en exceso a 27 (27(10 = 10000000(2) y 8 bits, haremos las operaciones: 0 0 0 0 1 1 0 0 (2 ← transportes 1 − 1 0 0 0 0 1 0 0 (2 1 0 0 0 1 0 0 0 (2 1 0 0 0 1 0 0 0 (2 1 0 0 0 0 0 0 0 (2 0 0 0 0 1 0 0 0 (2 ← transportes 1 + Representación de la información numérica 56 © FUOC • PID_00153515 El desbordamiento en las operaciones de suma y resta de valores codificados en exceso a M, donde M es 2n−1 y n el número de bits, se detecta al hacer la corrección del resultado. Cuando la suma o la resta del desplazamiento M que hacemos para corregir el resultado genera un transporte en la última etapa, hay desbordamiento. Consideremos una representación en exceso a 2 y 2 bits. La codificación del valor 1(10 en este sistema es 1(10 + 2(10 = 3(10 = 11(2. Si sumamos este valor codificado consigo mismo, obtenemos: ← transporte 1 + 1 1 1 (2 1 1 (2 1 0 (2 ← transporte 1 1 1 1 0 (2 1 0 0 − 0 Hay desbordamiento, porque en la última etapa del resto del desplazamiento realizada para corregir el resultado se produce un transporte. En la operación de resta, la manera de detectar el desbordamiento es idéntica. Si consideramos la representación en exceso a 4 y 3 bits, la codificación del valor 2(10 en este sistema es 2(10 + 4(10 = 6(10 = 110(2 y la del valor −2(10 es −2(10 + 4(10 = 2(10 = 010(2. De la operación de resta de estos valores obtenemos: 1 1 0 (2 − 0 1 0 (2 1 0 0 (2 ← transporte 1 1 0 0 (2 + 1 0 0 (2 1 0 0 0 (2 También ahora detectamos que hay desbordamiento, porque en la última etapa de la suma del desplazamiento realizada para corregir el resultado se produce un transporte. Detectaremos el desbordamiento en las operaciones de suma y resta de valores binarios codificados en exceso a M, cuando M es 2n−1, donde n es el número de bits, porque la operación de corrección del resultado genera un transporte en la última etapa. Representación de la información numérica 57 © FUOC • PID_00153515 Representación de la información numérica Actividades 23. Convertid los valores decimales siguientes a binarios en los sistemas de representación de signo y magnitud y complemento a 2, con un formato entero de 8 bits: a) 53 b) −25 c) 93 d) −1 e) −127 f) −64 24. Si tenemos los números binarios 00110110, 11011010, 01110110, 11111111 i 11100100, ¿cuáles son los equivalentes decimales, sin consideramos que son valores binarios representados en signo y magnitud? ¿Y si los consideramos valores en complemento a 2? 25. Tenemos las cadenas de bits siguientes: A = 1100100111, B = 1000011101 y C = 0101011011. Haced las operaciones que proponemos a continuación, si consideramos que son números binarios en formato de signo y magnitud: A + B, A − B, A + C, A − C, B − C, B + C. 26. Repetid la actividad 25, considerando que las cadenas representan números en complemento a 2. 27. Tenemos la cadena de bits 10110101. Haced las siguientes conversiones: a) Tened en cuenta que representa un número en Ca2 y representad el mismo número en signo y magnitud y 16 bits. b) Tened en cuenta que representa un número en signo y magnitud y representad el mismo número en Ca2 y 16 bits. 28. Determinad qué desplazamiento deberíamos utilizar para poder representar el intervalo [−25,50] con una representación en exceso. 29. Haced las siguientes codificaciones: a) Los números 3(10 y −8(10 en exceso a 7 y decimal. b) Los números −4(10 en 6 bits y exceso a 7. c) Los números 3(10 y −6(10 en una representación en exceso a 4 de 8 bits. 30. ¿Cuál es el valor decimal de los números 000000(2, 100000(2 i 111111(2 que están codificados en exceso a 31(10? 31. Determinad el signo de los números 0111000(2, 1001110(2 y 000000(2 codificados en una representación de 7 bits en exceso a 26. 32. Sumad los números 000100 y 100100 codificados en binario y exceso a 25. 33. Restad los números 000100 y 100100 codificados en binario y exceso a 25. 34. Suponed una representación de 5 bits en exceso a 10000(2 y calculad las siguientes sumas: a) 11000 + 00000 = b) 00000 + 00000 = c) 01000 + 11111 = 2.4. Números fraccionarios Como sabemos, en muchas ocasiones es necesario representar números que son menores que la unidad, como por ejemplo 0,03(10, o que tienen partes menores Podéis ver los sistemas de numeración posicionales en el subapartado 1.2 de este módulo. que la unidad, como por ejemplo 1,23(10. Estos números reciben el nombre de números fraccionarios y se representan con una notación posicional: 1,23(10 = 1 · 100 + 2 · 10−1 + 3 · 10−2 Si seguimos el método de cambio de base basado en el TFN, podremos conocer la magnitud decimal de un número fraccionario expresado en base 2. La magnitud decimal del 111,01101(2 es la siguiente: 1 · 22 + 1 · 21 + 1 · 20 + 0 · 2−1 + 1 · 2−2 + 1 · 2−3 + 0 · 2−4 + 1 · 2−5 = 7,40625(10 Podéis ver el método basado en el TNF en el subapartado 1.3.1 de este módulo. 58 © FUOC • PID_00153515 Representación de la información numérica La representación de los números fraccionarios dentro de los computadores se suele hacer destinando un número fijo de bits, del total de bits del formato, a la representación de la parte fraccionaria. Este tipo de representación recibe el nombre genérico de representación de coma fija. a Representación binaria en coma fija Las representaciones de coma fija no almacenan la posición de la coma de manera explícita. En la definición del formato se especifica la posición de la coma, y se asume que siempre es la misma. En un formato de representación de coma fija de n bits (n = p + m), donde m bits son fraccionarios, los números representados son de la forma: La magnitud decimal del número fraccionario representado es X(10 = −m ∑ x · 2 , donde xi es el bit de la posición i-ésima. i = p −1 i i Signo y magnitud en coma fija Las magnitudes fraccionarias también pueden llevar asociado un signo. Para incorporar esta información a la representación de números fraccionarios, lo más habitual es trabajar con una representación de signo y magnitud, en la cual la magnitud sea fraccionaria, como se indica en el subapartado 2.3.1. En un formato de coma fija de n bits (n = p + m), donde m bits son fraccionarios, y en signo y magnitud, los números son de la forma: donde xp−1 es el bit de signo y el resto de los bits codifican la magnitud. Otras maneras de representar números Hay otras maneras de representar números fraccionarios con signo. Por ejemplo, se podría utilizar la representación de complemento a la base (Ca2 en binario), pero no es habitual. Formato en coma fija Esta manera de representar los números fraccionarios es una extensión directa de la representación en signo y magnitud de números enteros. Por lo tanto, presenta las mismas ventajas e inconvenientes. De esta manera, por ejemplo, el 0 tiene dos representaciones, una con signo negativo y otra con signo positivo. © FUOC • PID_00153515 59 Representación de la información numérica En este tipo de representación, la descodificación u obtención del número representado es relativamente sencilla, ya que sólo hay que aplicar la fórmula definida en el TFN. Se debe saber, sin embargo, dónde está situada la coma (es decir, hay que saber con cuántos bits fraccionarios trabajamos). De este modo, para conocer en decimal el valor numérico representado por la codificación 010111101 que está en magnitud y signo en un formato de 9 bits (n = 9), de los cuales 4 son fraccionarios (m = 4), debemos seguir el procedimiento indicado en la siguiente figura: Por lo tanto, el número codificado es +1011,1101(2 = +11,8125(10. Magnitud decimal de un número codificado en coma fija y signo y magnitud Para encontrar la magnitud decimal que representa la codificación 10010010 que está en un formato de 8 bits, 4 de los cuales son fraccionarios, y en signo y magnitud, haremos las operaciones siguientes: 1) Separamos el bit de signo que es 1 (bit del extremo izquierdo) y que indica signo negativo. El resto de los bits 0010010 codifica la magnitud. 2) El valor decimal de la magnitud lo podemos conocer si aplicamos el TFN: 0 · 22 + 0 · 21 + 1 · 20 + 0 · 2−1 + 0 · 2−2 + 1 · 2−3 + 0 · 2−4 = 1 + 0,125 = 1,125(10 Por lo tanto, el número representado en decimal es –1,125(10. Codificación de un valor decimal en coma fija y signo y magnitud Para codificar el número –14,75(10, en un formato de coma fija de 8 bits en el que 3 son fraccionarios y signo y magnitud, haremos las operaciones siguientes: 1) Cambiar a base 2 el número 14,75(10 a partir del método basado en el teorema de la división entera. a) Codificar en binario la parte entera (14(10) en 4 bits (ya que de los 8 bits, 3 son fraccionarios y 1 codifica el signo; quedan 4 para la parte entera), aplicando el algoritmo de divisiones sucesivas: 14 7 3 1 =7×2+0 =3×2+1 =1×2+1 =0×2+1 De manera que obtenemos: 14(10 = 1110(2. b) Codificar en binario la parte fraccionaria en 3 bits: 0,75 · 2 = 1,50 = 1 + 0,5 0,5 · 2 = 1,0 = 1 + 0,0 De manera que obtenemos: 0,75(10 = 0,110(2. Podéis ver el método basado en el teorema de la división entera en el subapartado 1.3.2 de este módulo. 60 © FUOC • PID_00153515 Representación de la información numérica c) Juntar las partes enteras y fraccionarias, con lo cual obtenemos que la representación de la magnitud 14,75(10 con 7 bits, 3 de los cuales son fraccionarios, es: 14,75(10 = 1110,110(2 2) Añadir el bit de signo a la magnitud. El bit de signo es 1, ya que el signo es negativo. La representación en un formato de coma fija de 8 bits, donde 3 son fraccionarios, y signo y magnitud –14,75(10, es la siguiente: –14,75(10 = 1110,110(2 Recordemos que la coma no se almacena, sino que una vez especificado el formato se conoce su posición. En realidad, un computador almacenaría el código 11110110 sin coma ni especificación de base, que están fijados en la definición del formato. Cuando la representación en binario de la parte fraccionaria de un número excede el número de bits fraccionarios disponibles en el formato en signo y magnitud definido, el número no se podrá representar de una manera exacta. Será necesario aplicar, por lo tanto, uno de los métodos de aproximación explica- a dos: el truncamiento o el redondeo. Podéis ver las aproximaciones por truncamiento y redondeo en el subapartado 2.1.4 de este módulo. Cambio de base 10 a base 2 del número 8,9453125(10 1. Parte entera 8=4·2+0 4=2·2+0 2=1·2+0 1=0·2+1 2. Parte fraccionaria 0,9453125 · 2 0,890625 · 2 0,781250 · 2 0,5625 · 2 0,125 · 2 0,245 · 2 0,5 · 2 = 0,890625 + 1 = 0,781250 + 1 = 0,5625 + 1 = 0,125 +0 = 0,245 +0 = 0,5 +0 =0 +1 8,9453125(10 = 1000,1111001(2 A modo de ejemplo, intentemos representar el número +8,9453125(10 en un formato de coma fija y signo y magnitud, con 8 bits de los cuales 3 son fraccionarios. Si hacemos el cambio de base, encontramos que 8,9453125(10 = 1000,1111001(2. Deberemos utilizar uno de los métodos de aproximación, ya que la parte fraccionaria no cabe en los 3 bits disponibles en el formato: a) Por truncamiento. Se trata, sencillamente, de despreciar los bits que no tienen cabida. El 1000,1111001(2 se aproximará por el 1000,111(2. Añadimos el bit de signo y la codificación final será 01000111. El error de representación que se comete en este caso es: |1000,1111001(2 − 1000,111(2| = 0,0001001(2 = 0,0703125(10 b) Por redondeo. Se suma la mitad de la precisión: 1000,1111001(2 + 0,0001(2 = 1001,0000001(2 La precisión La precisión es la distancia entre dos números representables consecutivos (ved el subapartado 2.1.2) . Fácilmente, se comprueba que la precisión con 3 bits fraccionarios es 0,001(2 (distancia entre el 0,000 y el 0,001). Para conseguir la mitad de este valor, la coma se desplaza una posición hacia la izquierda (que equivale a dividir por 2 en base 2), es decir: 0,0001(2. 61 © FUOC • PID_00153515 Representación de la información numérica A continuación truncamos a 3 bits fraccionarios, de manera que el 1000,1111001(2 se aproximará por el 1001,000(2. Añadimos el bit de signo y la codificación final será 01001000. En este caso, el error de representación que se comete es menor: |1000,1111001(2 − 1000,000(2| = 0,0000111(2 = 0,0546875(10 Rango y precisión en coma fija La mayor magnitud binaria que podemos representar en un formato de coma fija es la que se obtiene si ponemos todos los bits que representan la magnitud a 1. Si el bit de signo lo ponemos a cero, tendremos la representación de la mayor magnitud positiva que se puede representar. Si el bit de signo es 1, se tratará de la mayor magnitud negativa que se puede representar. Estos números, el mayor y el menor, delimitan el intervalo que contiene los números que se pueden representar, es decir, el rango. El mayor número representable en signo y magnitud y un formato de coma fija de 9 bits con 3 fraccionarios es el 011111,111(2 = +31,875(10; el menor es el 111111,111(2 = −31,875(10. Por lo tanto, el rango en decimal de este formato es: [−31,875(10 + 31,875(10] En general, el mayor número que se puede representar con n bits, m de los cuales fraccionarios, se puede calcular si suponemos que todos los bits valen 1 y aplicamos el TFN: 1 · 2n−m−2 + 1 · 2n−m−3 + … + 1 · 20 + 1 · 2−1 + … + 1 · 2−m = 2n−m−1 − 2−m donde hemos aplicado la siguiente propiedad: k 111... 11 ( 2 = 2 k–1 +2 k–2 k 0 k 2 –2 2 –1 1 0 k + ...2 + 2 = ----------------- = --------------- = 2 – 1 2–1 1 El rango de una representación en signo y magnitud y un formato en coma fija de n bits, donde m son fraccionarios, es el siguiente: [−2n−m−1 + 2−m, 2n−m−1 − 2−m]. De la misma manera, el rango de una representación de números fraccionarios sin signo en un formato de coma fija de n bits, donde m son fraccionarios, es el siguiente: [0, + 2n−m − 2−m]. Ampliación de la parte fraccionaria Para ampliar en 3 bits la parte fraccionaria y en 2 bits la parte entera del número 111,001(2 que está en coma fija y signo y magnitud, añadiremos 3 ceros a la derecha de la magnitud y 62 © FUOC • PID_00153515 2 ceros la izquierda de la magnitud. La nueva codificación en el caso de signo y magnitud es 10011,001000(2, en la que se marcan en negro los dígitos añadidos. Esta ampliación, si el número 111,001(2 fuese una magnitud sin signo, daría lugar a la codificación 00111,001000(2. La ampliación de un formato en coma fija debe tener en cuenta los posibles cambios en la posición de la coma. De hecho, sólo es necesario conocer cuántos bits se destinan a la parte fraccionaria y cuántos a la parte entera. Una ampliación de k bits de la parte fraccionaria comporta añadir k ceros a la derecha de la magnitud. Una ampliación de p bits de la parte entera se consigue si añadimos p ceros a la izquierda de la magnitud. Si trabajamos en signo y magnitud, deberemos separar el signo de la magnitud para hacer los cambios y después añadirlo al extremo izquierdo. La extensión o ampliación de k bits por la parte fraccionaria y p bits por la parte entera de un formato de coma fija, tanto en signo y mag- nitud como sin signo, se consigue si añadimos k ceros a la derecha de la magnitud y p ceros a la izquierda de la magnitud. La precisión es la menor distancia entre dos números representables consecutivos. Si trabajamos con una representación en coma fija de 3 bits donde 1 es fraccionario y signo y magnitud los números que se pueden representar son: −1,1(2, −1,0(2, −0,1(2, 0,0(2, +0,1(2, +1,0(2 y +1,1(2. Como podemos observar, todos están separados una distancia 0,1(2. Por este motivo, la precisión es 0,1(2. En las representaciones de coma fija, la precisión es determinada por el bit menos significativo de la representación. a La precisión de una representación en coma fija de n bits, donde m son fraccionarios, es 2−m. Suma y resta en coma fija Las operaciones de suma y de resta en coma fija se hacen a partir del algoritmo habitual descrito en el apartado 1.5, como podemos ver en los siguientes ejemplos: − 1 + 1 , 1 0 0 0 0 0 , 1 0 0 (2 1 , 0 0 1 (2 1 0 1 (2 ← transportes ← resultado ← transportes 0 1 , 1 0 1 (2 0 , 1 0 0 (2 1 0 , 0 0 1 (2 ← resultado Representación de la información numérica 63 © FUOC • PID_00153515 Representación de la información numérica Observemos que un número fraccionario como por ejemplo el 1,101(2 se puede escribir 1101(2 · 2−3. Con este procedimiento, podemos asociar un número entero, en este caso el 1101(2, a un número fraccionario. Si aplicamos esta transformación a los números 1,101(2 y 0,100(2 de la suma anterior, obtenemos: 1,101(2 = 1101(2 · 2−3 i 0,100(2 = 0100(2 · 2−3. La suma se puede hacer de esta manera: 1101(2 · 2−3 + 0100(2 · 2−3 = (1101(2 + 0100(2) · 2−3 = 10001(10 · 2−3 Observemos que por este procedimiento hemos transformado una suma de números fraccionarios en una suma de números enteros. a Con la transformación anterior, las operaciones entre números fraccionarios se pueden llevar a cabo mediante operaciones entre números enteros. Observemos también que en la representación no aparece la ubicación de la coma. Sin embargo, puesto que todos los números con los que trabajaremos tendrá la coma en la misma posición, no hay que saber su situación para operar con los mismos. Es decir, las operaciones para sumar los números 11,01(2 y 00,01(2 o los números 1,101(2 y 0,001(2 son idénticas. La primera se puede escribir como: 11,01(2 + 00,01(2 = 1101(2 · 2−2 + 0001(2 · 2−2 = (1101(2 + 0001(2) · 2−2 y la segunda como: 1,101(2 + 0,001(2 = 1101(2 · 2−3 + 0001(2 · 2−3 = (1101(2 + 0001(2) · 2−3 En los dos casos, la operación realizada finalmente es la suma de los dos números enteros 1101(2 y 0001(2. A continuación sumamos estos números 11,111(2 y 01,111(2, que están en un formato de coma fija de 6 bits, con 3 fraccionarios: 1 + 1 1 1 ← transportes 1 1 1 1 1 1 (2 0 1 1 1 1 (2 1 0 1 1 1 0 (2 ← resultado © FUOC • PID_00153515 64 Representación de la información numérica Para representar el resultado, necesitamos un dígito más de los que tenemos disponibles en el formato definido. Por este motivo, el resultado no es representable en el formato especificado. Se ha producido desbordamiento, que podemos reconocer de la misma manera que en la suma de números naturales. El desbordamiento en la suma de números sin signo en coma fija se puede detectar de la misma manera que en el caso de la suma de números naturales. Recordemos que la resta no puede dar lugar a desbordamiento. El desbordamiento en la suma y la resta de números en coma fija y signo y magnitud se puede detectar de la misma manera que en el caso de la suma y la resta de números enteros representados en signo y magnitud. La resta de los números sin signo La resta de los números sin signo no puede dar lugar a desbordamiento, porque tenemos que restar la magnitud pequeña de la grande. Restar la magnitud grande de la magnitud pequeña no es una operación válida para números sin signo, porque el resultado debería ser un número con signo. Multiplicación y división por 2k en coma fija binaria Ya hemos analizado la multiplicación y la división por potencias de la base de numeración de manera genérica. Las operaciones de multiplicación y división por 2k en coma fija binaria corresponden al caso particular en el que la base de numeración es 2. Cuando la base de numeración es 2 en un sistema posicional de base fija, los pesos asociados a los dígitos son potencias de 2. Consiguientemente, multiplicar por 2 se traduce en aumentar en una unidad la potencia de 2 asociada a cada bit y dividir por 2 es equivalente a disminuir en una unidad la potencia de 2 asociada a cada bit. Por ejemplo, el número 0011,01(2 se puede expresar en términos de los pesos asociados a cada bit si seguimos el TFN: 0011,01(2 = 0 · 23 + 0 · 22 + 1 · 21 + 1 · 20 + 0 · 2−1 + 1 · 2−2 Si multiplicamos por 2, se obtiene: 0011,01(2 · 2 = (0 · 23 + 0 · 22 + 1 · 21 + 1 · 20 + 0 · 2−1 + 1 · 2−2) · 2 = = 0 · 24 + 0 · 23 + 1 · 22 + 1 · 21 + 0 · 20 + 1 · 2−1 = 00110,1(2 La multiplicación o la división de un número binario por una potencia de 2 provoca el desplazamiento de la coma fraccionaria. a En un formato de coma fija, el número de bits que se destinan a la parte entera y a la parte fraccionaria se mantienen constantes. Por lo tanto, para hacer multiplicaciones o divisiones por la base no es factible desplazar la coma fraccio- Podéis ver la multiplicación y la división por potencias de la base de numeración del subapartado 1.6 de este módulo. 65 © FUOC • PID_00153515 naria. Conseguiremos el mismo efecto si desplazamos los bits y completamos con ceros. Multiplicar por 2k un número en coma fija sin signo equivocado equi- vale a desplazar los bits k posiciones a la izquierda, y completar los n bits del formato con la adición a la derecha de los ceros necesarios. Dividir por 2k un número en coma fija sin signo equivale a desplazar los bits k posiciones a la derecha, y completar los n bits del formato con la adición a la izquierda de los ceros necesarios. De este modo, el número 0011,01(2 representado en un formato de coma fija de 6 bits donde 2 son fraccionarios se puede multiplicar por 22 si desplazamos los bits dos posiciones a la izquierda y completamos con los ceros necesarios: 0011,01(2 · 22 = 1101,00(2 Esta operación puede comportar que el resultado del desplazamiento sea un número que no cabe en el formato de coma fija especificado, de manera que provoque desbordamiento. En los formatos de coma fija sin signo, detectaremos esta situación porque al hacer los desplazamientos a la izquierda perderemos bits significativos (diferentes de cero, en el caso de coma fija sin signo). Se produce desbordamiento al multiplicar un número sin signo en coma fija por 2k cuando se pierden uno o más bits significativos (diferentes de cero) al desplazar los bits k posiciones. El resultado de la operación de división por 2k de un número en coma fija sin signo también se puede conseguir con desplazamientos de los bits. Para dividir el número 010100(2 en coma fija sin signo y 6 bits, dos de los cuales son fraccionarios, por 22 desplazamos los bits dos posiciones a la derecha: Por aplicación del TFN 0101,00(2 = 1 · 22 + 1 · 20 = 5(10 0001,01(2 = 1 · 20 + 1 · 2−2 = 1,25(10 0101,00(2 / 22 = 0001,01(2 (en decimal, +5(10 / 22 = +1,25(10) El resultado de la división por 2k de un número en coma fija sin signo se obtiene si desplazamos los bits k posiciones a la derecha y añadimos a la izquierda los ceros necesarios para completar los n bits del formato. Representación de la información numérica 66 © FUOC • PID_00153515 En el caso de la división por 2k no se puede producir desbordamiento, pero podemos perder bits significativos que hagan que el resultado no sea exacto, como en el siguiente ejemplo: 0101,00(2 / 24 ≈ 0000,01(2 (en decimal, +5(10 / 24 ≈ + 0,25(10) Cuando se pierden bits significativos (diferentes de cero) al desplazar los bits a la derecha, el resultado de la operación de división por 2k no es exacto. La pérdida de bits significativos por la derecha equivale a hacer una aproximación por truncamiento. a En el caso de los formatos de coma fija en signo y magnitud, las operaciones de multiplicación y división por 2k tienen las mismas características que las descritas más arriba para los formatos de coma fija sin signo, si dejamos de lado el bit de signo. Es decir, una vez separado el bit de signo, nos encontramos en el mismo caso que en un formato de coma fija sin signo. El bit de signo a se añadirá al final de la operación. Actividades 35. Determinad qué valor decimal codifica la cadena de bits 1010010 en los supuestos siguientes: a) si se trata de un número en coma fija sin signo de 7 bits, donde 4 son fraccionarios. b) si se trata de un número en coma fija sin signo de 7 bits, donde 1 es fraccionario. 36. Codificad los números +12,85(10, +0,7578125(10 y −11,025(10 en una representación fraccionaria binaria en signo y magnitud de 8 bits, donde 3 son fraccionarios. Si es necesario, utilizad una aproximación por redondeo. 37. Si tenemos una representación en signo y magnitud de 8 bits, donde 3 bits son fraccionarios, determinad los números codificados por las cadenas de bits 01001111, 11001111, 01010100, 00000000 y 10000000. 38. Si las cadenas de bits 00101010, 11010010 y 10100010 representan números en coma fija sin signo de 8 bits donde 3 son fraccionarios, representadlos en formato de coma fija sin signo de 12 bits en los que 4 son fraccionarios. 39. Repetid la actividad 38, pero considerando que se trata de números en signo y magnitud. 40. Determinad el rango de representación y la precisión en los siguientes formatos: a) Coma fija en signo y magnitud con 8 bits donde 3 son fraccionarios. b) Coma fija en signo y magnitud con 8 bits donde 4 son fraccionarios. c) Coma fija sin signo con 8 bits donde 3 son fraccionarios. d) Coma fija sin signo con 8 bits donde 4 son fraccionarios. 41. Determinad la precisión necesaria para poder representar el número +0,1875(10 de una manera exacta (sin error de representación) con un formato de coma fija en base 2. 42. Determinad las características de rango y precisión, y también el número de dígitos enteros y fraccionarios necesarios en un formato de coma fija en signo y magnitud, para poder representar de una manera exacta los números +31,875(10 y −16,21875(10. 43. Haced la suma y la resta de los pares de siguientes números, suponiendo que están respresentados en signo y magnitud con 8 bits donde 3 son fraccionarios: a) 00111000(2 y 10100000(2 b) 10111010(2 y 11101100(2 Verificad si el resultado es correcto Representación de la información numérica 67 © FUOC • PID_00153515 Representación de la información numérica 2.5. Representación en coma flotante El uso de la representación de números en notación científica está justificado cuando debemos trabajar con números muy grandes o con números muy pe- Podéis ver la representación de números en notación científica en el subapartado 1.7 de este módulo. queños, y quizá de manera simultánea. La gran ventaja que ofrece es la posibilidad de representar números que, de otro modo, requerirían un número elevado de dígitos para codificarlos. La representación en notación científica también recibe el nombre de representación en coma flotante, en oposición al término coma fija, y de esta manera nos a referiremos a este tipo de representación de ahora en adelante. A diferencia de la coma fija, donde la posición de la coma fraccionaria está fijada en el formato y siempre es la misma, en coma flotante la posición de la coma se determina a partir del valor que toma el exponente. El número +32,74(10 · 102 es equivalente al +327410, mientras que +32,74(10 · 10−1 es equivalente a +3,274(10. El valor del exponente indica la posición relativa de la coma fraccionaria. Los números en coma flotante toman la forma: ±R · be Donde ‘+’ o ‘−’ indica el signo de la magnitud representada, R es un número fraccionario que recibe el nombre de mantisa, b es la base de numeración y e es un número entero que recibe el nombre de exponente. Dentro de los computadores, los números representados en coma flotante toman la base 2 como base de numeración. Es el caso de −11,101(2 · 2101(2, 0,011(2 · 211(2 y −1110,001(2 · 2101(2. Observemos que tanto la mantisa como el exponente están codificados en binario. Para simplificar la notación, escribiremos los exponentes en base 10 aunque se trate de una representación binaria. Es decir, no escribiremos +1,011(2 · 211(2, a sino +1,011(2 · 23. En el trabajo manual, adaptamos dinámicamente el número de dígitos utilizados en la mantisa y el exponente de la representación en coma flotante. Podemos utilizar +2,995 · 108 o +0,02995 · 1010, según convenga a nuestras necesidades. Para agilizar los cálculos dentro de los computadores, debemos ceder esta flexibilidad y adoptar restricciones que permitirán simplificar el procesamiento de este Terminología Se pueden utilizar los términos notación científica o coma flotante indistintamente para designar este tipo de representación. En los apartados siguientes, sin embargo, se utilizará la denominación coma flotante. 68 © FUOC • PID_00153515 Representación de la información numérica tipo de datos. Asumiremos que la base de numeración es 2 y que el número de bits destinados a la mantisa y al exponente se fija en la especificación del formato. Para la representación en coma flotante dentro de los computadores, asumiremos que la base de numeración es 2 y que en la definición Nota Aunque la base de numeración dentro de los computadores es 2, a lo largo del texto utilizaremos base 10 en algunos casos para ejemplificar los conceptos que presenten. del formato se fijará el número de bits de la mantisa y el número de bits del exponente. La representación de un valor numérico en coma flotante no es única. Un mismo número se puede escribir de distintas maneras. Algunas representa- La representación de un valor numérico en coma flotante no es única. ciones del número 26300(10 en coma flotante son: 2,63(10 · 104, 0,263(10 · 105, 263(10 · 102, 2630(10 · 101, 26300(10 · 100 o 263000(10 · 10−1. De nuevo, podemos conseguir mejoras en el procesamiento de los números en coma flotante dentro de los computadores si restringimos esta flexibilidad. Eliminaremos la multiplicidad de representaciones si fijamos la posición de la coma fraccionaria de la mantisa respecto del primer dígito no nulo. Por ejemplo, el formato puede determinar que la coma está a la derecha del primer dígito no nulo. Con esta limitación, el número 26300(10 tiene una representación única, que es 2,63 · 104. Un tipo de operación que se simplifica si fijamos la posición de la coma de la mantisa es la comparación de valores numéricos. Para evitar la multiplicidad de representaciones de un mismo valor numérico propia de la representación en coma flotante, en la definición del formato que hay que utilizar se fija la posición de la coma fraccionaria respecto del primer dígito no nulo. Cuando la mantisa tiene fijada la posición de la coma fraccionaria, recibe el calificativo de mantisa normalizada. Las posiciones más habituales a las que se fija la coma de la mantisa son la derecha del primer dígito no nulo y la izquierda del primer dígito no nulo. En este curso, utilizaremos la primera alternativa: asumiremos que la coma de la mantisa está a la derecha del primer dígito no nulo, excepto que se indique a explícitamente otro tipo de normalización. Los valores numéricos representados en coma flotante con mantisa normalizada y coma a la derecha del primer bit no nulo son de la forma: ±1, x−1x−2 · · · · · x−k · be donde xi son dígitos binarios (bits), b es la base de numeración y e es el exponente. Coma flotante con mantisa normalizada En las representaciones en coma flotante con la coma de la mantisa fijada a la izquierda del primer dígito no nulo, los números son de la forma: ±0,1x−2 ... x−k · be. © FUOC • PID_00153515 69 Representación de la información numérica Para la representación de números en coma flotante dentro de los computadores, se aprovechan las ventajas que comporta la asunción de las restricciones anteriores. La primera que se deriva de éstas es que no hay que almacenar la base de numeración, porque se asume que es 2, tanto para la mantisa como para el exponente. La codificación en coma flotante debe incorporar la información de signo, el valor de la mantisa y el del exponente. La figura siguiente muestra el orden en el que es habitual disponer estos valores dentro del conjunto de dígitos dispo- El orden de precedencia signoexponente-mantisa no es el único posible, pero sí que es el orden más utilizado. nibles para la representación: Como se ve en la figura, un bit se destina a la representación del signo. La codificación habitual del bit de signo es 0 para indicar signo positivo y 1 para indicar signo negativo. El valor del exponente en las representaciones en coma flotante suele estar restringido a los enteros. Para codificarlo, lo más habitual es utilizar una represen- El tipo de representación Aunque exceso a M sea la representación más habitual del exponente, se puede utilizar cualquier otro tipo de representación de números enteros, como por ejemplo Ca2. tación en exceso a M, donde M toma frecuentemente los valores 2q−1 o 2q−1 − 1, en los que q es el número de bits disponibles para la codificación del exponente. Las alternativas de representación de la mantisa y el exponente, y también las posibilidades de combinar signo, exponente y mantisa en la codificación final hacen que el número de posibles representaciones en coma flotante sea muy amplio. En este curso, si no se especifica otra cosa, utilizaremos representaciones en coma flotante en las que el signo, el exponente y la mantisa los encontraremos en este orden. Un 0 en el bit de signo indicará signo positivo, mientras que un 1 indicará signo negativo. El exponente estará codificado en exceso a M, con M = 2q−1, donde q es el número de bits disponibles para la representación del exponente y la mantisa será normalizada con la coma a la derecha del primer bit no nulo. a En un formato de coma flotante de 8 bits con mantisa normalizada de 4 bits y exponente en exceso a M, en el que M toma el valor 2q−1 y q es el número de bits disponibles para la representación del exponente, la codificación del número −10,11(2 · 22 es la que se muestra en la figura siguiente: Exceso a 4 porque... ... hay un total de 8 bits, de los cuales 4 son para representar la mantisa normalizada y 1 para codificar el signo. Para el exponente quedan 3 bits. Si M toma el valor 2q−1, M = 23−1 = 22 = 4. El exponente se representa en exceso a 4. 70 © FUOC • PID_00153515 Representación de la información numérica La siguiente tabla muestra algunos números representados en este formato: Números S e R −1,101(2 · 2−1 1 0 1 1 1 1 0 1 1,101(2 · 2−1 0 0 1 1 1 1 0 1 0,01(2 · 2−1 0 0 0 1 1 0 0 0 −110(2 · 2−1 1 1 0 1 1 1 0 0 A lo largo del texto, utilizaremos las letras S, e y R para referirnos, respectivamente, al signo, el exponente y la mantisa. En la tabla precedente podemos observar que el primer bit de la mantisa (columna R) siempre es 1. El motivo es el tipo de codificación que hemos elegido para la mantisa. Las mantisas son de la forma 1,x−1x−2… Tienen una parte fija (1,) y una parte variable (x−1x−2…). Para optimizar recursos, podemos almacenar sólo la parte variable, ya que la parte fija es conocida y común a todos los números. Esto permitirá almacenar 1 bit más para la mantisa, de manera que aumentará la precisión, o bien utilizar un bit menos en la representación. Las mantisas almacenadas con esta técnica reciben el nombre de mantisas con bit implícito. La técnica del bit implícito consiste en almacenar sólo la parte variable de las mantisas normalizadas y asumir la parte fija como conocida y definida en el formato de la representación. El uso del bit implícito permite almacenar mantisas 1 bit mayores, es decir, redu- a cir en 1 bit el número de bits necesarios para la representación de la mantisa. Codificación de un número decimal en coma flotante normalizada y binaria Para codificar el número +104(10 en un formato de coma flotante normalizada de 8 bits, de los cuales 3 bits se destinan a la mantisa con bit implícito y exponente en exceso a M, seguiremos el proceso siguiente: 1) Codificar el número +104(10 en base 2. Si aplicamos el método de cambio de base basado en divisiones sucesivas, obtenemos que 104(10 = 1101000(2. 2) Normalizar la mantisa de la forma 1,x−1x−2x−3…: 1101000(2 = 1,101 · 26. El cambio de base Para cambiar a base 2 el 104(10 hacemos divisiones sucesivas: 104 = 52 · 2 + 0 52 = 26 · 2 + 0 13 = 6 · 2 + 1 6 =3·2+0 3 =1·2+1 1 =0·2+1 104(10 = 1101000(2 3) Identificar el signo, el exponente y la mantisa. a) El número es positivo; por lo tanto, el bit de signo será 0: S = 0. b) La mantisa de este número es 1,101. El formato indica que trabajamos con una mantisa de 3 bits y bit implícito. Por lo tanto, guardaremos los 3 bits a la derecha de la coma: 101. c) El exponente toma el valor 6. 4) Codificar en exceso a M el exponente. De los 8 bits del formato, 3 se utilizan para la mantisa y 1 para el signo. Quedan 4 para el exponente. Por lo tanto, el valor del exceso es 24−1 = 23 = 8. El 6(10 codificado en exceso a 8 es 6(10 + 8(10 = 14(10. Si aplicamos otra vez el método de cambio de base basado en divisiones sucesivas, encontramos que el 14(10 en base 2 es el 1110(2. Por lo tanto, e = 1110. 5) Juntar las codificaciones de signo, exponente y mantisa en el orden de precedencia correcto (S – e − R) para obtener la representación final: S Exponente 0 1 1 1 Mantisa 0 1 0 1 Por lo tanto, la codificación del número +104(10 en el formato binario de coma flotante especificado es 01110101. El cambio de base Para cambiar a base 2 el 14(10 hacemos divisiones sucesivas: 14 = 7 · 2 + 0 17 = 3 · 2 + 1 13 = 1 · 2 + 1 11 = 0 · 2 + 1 14(10 = 1110 (2 El subrayado destaca la posición del exponente dentro de una cadena de bits que codifica un número en coma flotante. 71 © FUOC • PID_00153515 Descodificación de un número en coma flotante normalizada binaria Para encontrar el valor decimal del número 01010101 que está en un formato de coma flotante normalizada de 8 bits con 4 bits de mantisa con bit implícito y exponente en exceso, seguiremos el proceso siguiente: 1) Identificar el signo. Si asumimos que el formato mantiene signo, exponente y mantisa en este orden, el bit del extremo izquierdo codifica el signo. En el 01010101 el primer bit es 0; por lo tanto, el signo es positivo. 2) Identificar la mantisa. Dado que la mantisa ocupa las cuatro posiciones más bajas, se trata de los bits 0101. Ahora bien, el formato indica la existencia del bit implícito. Por lo tanto, la mantisa es en realidad 1,0101(2. 3) Identificar el exponente. El exponente es determinado por los 3 bits que quedan: S Exponente 0 1 0 1 Mantisa 0 1 0 1 M toma el valor 2q−1, por lo cual M = 23−1 = 22 = 4. De este modo, el exponente codificado es 101(2 − 4(10 = 5(10 − 4(10 = 1(10. El exponente e = 1(10. 4) Juntar signo, exponente y mantisa. Signo positivo, mantisa 1,0101(2 y exponente 1(10: el número representado es el +1,0101 · 21. 5) Hacer un cambio de base para encontrar el valor decimal. Si aplicamos el TFN, encontramos que: +1,0101(2 · 21 = (1 · 20 + 0 · 2−1 + 1 · 2−2 + 0 · 2−3 + 1 · 2−4) · 21 = 21 + 2−2 · 21 + 2−4 · 21 = +2,625(10 Por lo tanto, el número 01010101 codifica en el formato de coma flotante especificado el valor decimal +2,625(10. Para encontrar el número 10010001 que está en un formato de coma flotante normalizada de 8 bits con 5 bits de mantisa con bit implícito y exponente en exceso, seguiremos el proceso siguiente: 1) Identificar el signo. Si asumimos que el formato mantiene signo, exponente y mantisa en este orden, el bit del extremo izquierdo codifica el signo. En el 10010001 el primer bit es 1; por lo tanto, el signo es negativo. 2) Identificar la mantisa. Dado que la mantisa ocupa las cinco posiciones más bajas, se trata de los bits 10001. El formato indica la existencia de bit implícito. Por lo tanto, la mantisa es en realidad 1,10001(2. 3) Identificar el exponente. El exponente es determinado por los 2 bits que quedan: S 1 e 0 Mantisa 0 1 0 0 0 1 M toma el valor 2q−1, por lo cual M = 22−1 = 21 = 2. De este modo, el exponente codificado es 00(2 − 2(10 = 0(10 − 2(10 = −2(10. El exponente e = −2(10. 4) Juntar signo, exponente y mantisa. Signo negativo, mantisa 1,10001(2 y exponente −2(10: el número representado es el − 1,10001(2 · 2−2. 5) Hacer un cambio de base para encontrar el valor decimal. Si aplicamos el TFN, encontramos que −1,10001(2 · 2−2 = −(1 · 20 + 1 · 2−1 + 0 · 2−2 + 0 · 2−3 + 0 · 2−4 + 1 · 2−5) · 2−2 = = −(2−2 + 2−1 · 2−2 + 2−5 · 2−2) = −0,3828125(10 Por lo tanto, el número 10010001 codifica en el formato de coma flotante especificado el valor decimal −0,3828125(10. Representación de la información numérica 72 © FUOC • PID_00153515 Representación de la información numérica 2.5.1. Rango de representación en coma flotante La definición de rango de representación establece que es el menor intervalo que contiene todos los números representables en un sistema de representación numérica. Para conocer el rango de representación de un formato en coma flotante, debemos encontrar el número mayor y el menor que podemos representar. Los pasos que hay que seguir para la determinación del rango de una representación en coma flotante son: 1) Obtener el mayor valor del exponente. 2) Obtener el mayor valor de la mantisa. 3) Encontrar la mayor magnitud representable con la combinación de estos valores. El rango está delimitado por los valores positivo y negativo de esta magnitud. La mayor magnitud que podemos representar en coma flotante es aquella que tiene el exponente mayor con la mantisa mayor. El rango de representación del exponente, si asumimos que está codificado en exceso a M y M = 2q−1 donde q es el número de bits disponibles para la representación del exponente, es [−2q−1, 2q−1 − 1]. El valor máximo del exponente será, por lo tanto, 2q−1 − 1 = M − 1. El valor máximo de la mantisa, que en este curso consideramos que está normalizada de la forma 1,x−1x−2…, es aquél en el que todos los bits (todos los xi) son 1. Con k bits para la representación, la mantisa normalizada y bit imk+1 plícito, el valor máximo es de la forma 1, 11 ... 11. Hay k + 1 bits, porque debemos incluir el bit implícito que no se almacena en la representación. Para encontrar el valor de esta mantisa, calculamos: 1,11 k +1 11 = 111 k +1 ( 11 · 2 − k = 2 k + 2 k −1 + 2 k − 2 + ⎛ 2 k +1 − 2 0 ⎞ − k 21 + 2 0 · 2 − k = ⎜ ⎟· 2 = ⎝ 2 −1 ⎠ ) ⎛ 2 k +1 − 1 ⎞ − k 1 k +1 −k 1 −k =⎜ ⎟ · 2 = 2 −1 · 2 = 2 − 2 = 2 − k 2 ⎝ 1 ⎠ ( ) Por lo tanto, la mayor magnitud que podemos representar en el formato de coma flotante descrito es: 1 ⎞ (2 ⎛ ⎜ 2 − 2k ⎟ · 2 ⎝ ⎠ q −1 ) −1 ( 1⎞ 2 M −1 ⎛ = ⎜ 2 − k ⎟ · 2 M −1 = 2 · 2 M −1 − k = 2 M − 2 M − k −1 = 2 M · 1 − 2 −( k +1) 2 ⎠ 2 ⎝ ) Rango en exceso a M El rango en exceso a M es [−M, 2q−1−M ], donde q es el número de bits disponibles. Si M toma el valor 2q−1 queda el rango siguiente: [−2q−1, 2q − 1 − 2q−1] = [−2q−1, 2q − 2q−1 − 1] = [−2q−1, 2q−1 − 1] = [−M, M − 1] 73 © FUOC • PID_00153515 Representación de la información numérica La mayor magnitud que podemos representar en un formato de coma flotante de n bits, de los cuales k bits representan la mantisa normalizada de la forma 1,x−1x−2… (es decir, con la coma a la derecha del primer bit a 1), con bit implícito y exponente de q bits en exceso a M, si asumimos que M toma el valor 2q−1 es: 1 ⎞ M −1 ⎛ 1 ⎞ (2q−1 −1) ⎛ = ⎜2 − k ⎟ · 2 ⎜2 − k ⎟ · 2 2 ⎠ 2 ⎠ ⎝ ⎝ En las representaciones de coma flotante, el signo se representa con un bit que lo codifica. Por este motivo, la cantidad de números positivos que se pueden representar es exactamente igual a la de números negativos. Es un sistema de representación totalmente simétrico. Por lo tanto, el rango está determinado por los valores positivo y negativo de la mayor magnitud representable. Por lo tanto, el rango de representación de un formato de coma flotante de n bits, de los cuales k bits representan la mantisa normalizada de la forma 1,x−1x−2… (es decir, con la coma a la derecha del primer bit a 1), con bit implícito y exponente de q bits en exceso a M, si asumimos que M toma el valor 2q−1 es: ⎡ ⎛ 1 ⎞ M −1 ⎢− ⎜ 2 − k ⎟ · 2 , 2 ⎠ ⎣ ⎝ ⎡ ⎛ 1 ⎞ (2q−1 −1) , = ⎢− ⎜ 2 − k ⎟ · 2 2 ⎠ ⎣ ⎝ ⎤ 1⎞ ⎛ + ⎜ 2 − k ⎟ · 2 M −1 ⎥ = 2 ⎠ ⎝ ⎦ 1 ⎞ (2q−1 −1) ⎤ ⎛ + ⎜2 − k ⎟ · 2 ⎥ 2 ⎠ ⎝ ⎦ El rango establece el intervalo que contiene los valores representables, pero esto no quiere decir que se puedan representar todos los números contenidos en el intervalo. De hecho, en el formato de coma flotante definido no se puede representar el cero, ya que la menor mantisa que se puede representar es dife- a rente de cero, a causa del bit implícito, precisamente. Por este motivo, el rango de representación de los formatos en coma flotante se da como la unión de dos intervalos, uno que incluye todos los números negativos representables y otro que incluye todos los números positivos representables. La menor magnitud que se puede representar en un formato de coma flotante con bit implícito es la que tiene la mantisa de menor magnitud y el menor exponente. La menor mantisa es de la forma 1,0…0, y el menor exponente representable en exceso a M es −M. El problema de la representación del cero El problema de la representación del cero se soluciona en algunos formatos de coma flotante si reservamos una codificación determinada para representarlo. Por ejemplo, en el estándar IEEE754, cuando los bits de exponente y mantisa son ceros se asume que se trata del valor cero. De una manera semejante, se reservan otras codificaciones para representar valores que tienen un interés especial, como por ejemplo +∞ y −∞. 74 © FUOC • PID_00153515 Representación de la información numérica La menor magnitud que se puede representar en un formato de coma flotante de n bits, de los cuales k bits representan la mantisa normalizada de la forma 1,x−1x−2… (es decir, con la coma a la derecha del primer bit a 1), con bit implícito y exponente de q bits en exceso a M, si asumimos que M toma el valor 2q−1 es: 1,0 · 2−M = 2−M = 2−2 q−1 Por lo tanto, no se pueden representar números dentro del intervalo abierto ( −2 2 −( q −1) , 22 −( q −1) ) , en donde se incluye el cero. a Sin embargo, esto nos permite ajustar el rango de representación como la unión de dos intervalos, con lo cual se excluye el intervalo abierto de no re- Intervalos abiertos y cerrados Un intervalo es abierto cuando no incluye los valores numéricos que lo delimitan; cerrado, cuando los incluye. presentación que acabamos de definir. El rango de representación de un formato de coma flotante de n bits, de los cuales k bits representan la mantisa normalizada de la forma 1,x−1x−2 ··· (es decir, con la coma a la derecha del primer bit a 1), con bit implícito y exponente de q bits en exceso a M, si asumimos que M toma el valor 2q−1 es: ⎡ ⎛ 1 ⎞ M −1 − M ⎤ ⎡ − M ⎛ 1 ⎞ M −1 ⎤ ⎢ − ⎜ 2 − k ⎟ · 2 , 2 ⎥ ∪ ⎢ +2 , + ⎜ 2 − k ⎟ · 2 ⎥ 2 2 ⎠ ⎝ ⎠ ⎣ ⎝ ⎦ ⎣ ⎦ Esta manera de especificar el rango muestra las magnitudes mayores y menores que se pueden representar y pone de manifiesto que no se puede representar el cero. Los parámetros que definen el formato de coma flotante, como por ejemplo la existencia o no de bit implícito, la manera de normalizar la mantisa, el número de bits destinados al exponente y los destinados a la mantisa y el tipo de codificación del exponente influyen directamente sobre el rango. En cada caso, se debe hacer el cálculo de acuerdo con estos parámetros para determinarlo. a La ampliación del formato de coma flotante es una combinación de la ampliación de la representación del exponente y la representación de la mantisa. La ampliación o extensión en coma flotante consiste en convertir los números representados en un formato con q bits para el exponente y k bits para la mantisa a un formato con p + q bits para el exponente y j + k bits para la mantisa. Si consideramos que el exponente está en exceso a M, la ampliación de q a p + q bits para el exponente sigue el procedimiento que ya hemos descrito. Podéis ver la ampliación de los números representados en exceso a M en el subapartado 2.3.10 de este módulo. 75 © FUOC • PID_00153515 La extensión de una mantisa fraccionaria es sencilla. Convertir una mantisa fraccionaria de k bits en una representación de j + k bits sólo comporta añadir j ceros a la derecha. El bit de signo no cambia. La ampliación de una codificación en coma flotante con q bits para el exponente representado en exceso a M, y k bits para la mantisa fraccionaria, a un formato con p + q bits para el exponente y j + k bits para la mantisa, se consigue si mantenemos el bit de signo inicial y hacemos la extensión de la mantisa y del exponente. La ampliación de una mantisa fraccionaria de k bits a una mantisa fraccionaria de j + k bits se consigue si añadimos j ceros a la derecha de la mantisa. La ampliación de un exponente en exceso a M se consigue si aplicamos la extensión a p + q bits de un formato en exceso a M. Extensión de un formato de coma flotante Para extender la codificación 10100100 que representa un número en formato de coma flotante de 8 bits, donde 4 bits son de mantisa fraccionaria y 3 bits de exponente en exceso a M, con M = 2q−1 donde q es el número de bits para el exponente, a un formato de 16 bits donde 7 son de mantisa y 8 de exponente en exceso a M con M = 2q−1y q el número de bits del exponente, procederemos de la siguiente manera: 1) Identificar signo, mantisa y exponente de la codificación 10100100: signo = 1 mantisa = 0100 exponente = 010 2) Extender la mantisa fraccionaria. Pasar de 4 a 7 bits equivale a añadir tres ceros a la derecha: 0100 → 0100000 3) Ampliar el exponente. El exponente de 3 bits hace que el exceso tome el valor M = 4 , ya que 2q−1 = 23−1 = 22 = 4. Al pasar a 8 bits, M toma el valor 128, ya que 2q−1 = 28−1 = 27 = 128. La codificación de 3 bits 010 en exceso a 4 se extiende a una codificación de 8 bits en exceso a 128 añadiendo cinco unos a la derecha del bit de más peso (es un número negativo, puesto que empieza por cero y la diferencia en número de bits es 5, 8 − 3 = 5). 010 → 01111110 4) Juntar la mantisa nueva y el exponente nuevo con el signo para obtener la codificación nueva: 1011111100100000 2.5.2. Precisión de una representación en coma flotante La precisión de una representación es la distancia entre dos números representables. Si analizamos el número 0100101, que está en coma flotante de 8 bits, mantisa normalizada y bit implícito y exponente de 4 bits, encontraremos que es el +1,010(2 · 21. El número representable que lo sigue es aquel que obtene- Representación de la información numérica 76 © FUOC • PID_00153515 mos si sumamos 1 al bit menos significativo de la mantisa, es decir, el +1,011(2 · 21. De una manera semejante, el número representable anterior al 1,010(2 · 21 corresponde al que obtenemos si restamos 1 en el bit menos significativo de la mantisa, es decir, el 1,001(2 · 21. Podemos ver que la distancia entre el 1,010(2 · 21 y el 1,011(2 · 21 es 0,001(2 · 21 y que la distancia entre el 1,010(2 · 21 y el 1,001(2 · 21 también es 0,001(2 · 21. Consideremos ahora el número 01011010(2, que está codificado en el mismo formato. Si analizamos este número, encontraremos que se trata del +1,010(2 · 23. Si seguimos el mismo procedimiento, podemos obtener el número siguiente y el anterior, que corresponden, respectivamente, al 1,011(2 · 23 y el 1,001(2 · 23. En este caso, la distancia entre los números es 0,001(2 · 23. La distancia que separa estos números es diferente de la que hemos encontrado anteriormente, aunque se trata del mismo formato de coma flotante. En las representaciones de coma flotante, la distancia que separa dos números representables consecutivos depende de su magnitud. a El hecho de que la distancia sea distinta es a causa de la diferencia en el valor del exponente. La distancia entre números consecutivos se mantiene si el exponente es el mismo. La precisión de un formato de coma flotante de n bits, de los cuales k bits representan la mantisa normalizada de la forma 1,x−1x−2… (es decir, con la coma a la derecha del primer bit a 1), con bit implícito y exponente de q bits en exceso a M, si asumimos que M toma el valor 2q−1 es: 2−k · 2e donde e es el valor del exponente del número representado. El hecho de que la distancia entre un número representable y el siguiente dependa del número representado comporta que, a diferencia de lo que ocurre en la coma fija, en coma flotante la distancia entre los números no es constante. Por lo tanto, la distribución de los números representables en coma flotante sobre la recta de los reales no es uniforme. La figura siguiente muestra este hecho de una manera esquemática: Representación de la información numérica 77 © FUOC • PID_00153515 Representación de la información numérica La figura muestra la distribución de los números representables con 5 bits en coma fija y en coma flotante. Los números en coma fija (bajo) son de la forma ±x0,x−1x−2x−3 (1 bit por el signo y 4 por la magnitud con 3 bits fraccionarios) y tienen una distribución uniforme. Los números en coma flotante (arriba) son de la forma ±1,x−1x−2 · 2e (mantisa de 2 bits normalizada y con bit implícito y exponente de 2 bits en exceso a M) y la distribución es simétrica respecto del cero, pero no uniforme. La cantidad de números representables es la misma en los dos formatos (salvo el problema del doble cero de la coma fija). Las dos representaciones disponen de 4 bits para representar la magnitud y 1 bit para representar el signo. Ahora bien, la diferencia en la distribución hace que la representación de coma flotante tenga un rango mayor que la de coma fija. Además, la precisión en coma flotante es mejor (los números son más cercanos) cuando los números representados son pequeños. Error de representación en coma flotante En los ejemplos de codificación que preceden, los números se pueden codificar de una manera exacta, es decir, no es necesario hacer ningún tipo de aproxima- Podéis ver las aproximaciones por redondeo y por truncamiento en el subapartado 2.1.4 de este módulo. ción. Ahora bien, cuando la mantisa no cabe en los bits que en el formato se destinan para representarla, la debemos aproximar a partir de uno de los dos métodos presentados, redondeo o truncamiento, lo cual introduce un error de representación: el número representado no es exactamente el que queríamos re- a presentar, sino un número cercano. En este curso asumiremos que, por defecto, el método de aproximación aplicado a las mantisas es el truncamiento. a Codificación en coma flotante normalizada binaria de un número en base 10 con aproximación Para codificar el número −85,3(10 · 102 en un formato de coma flotante normalizada de 16 bits, de los cuales 7 bits son de mantisa, con bit implícito y exponente en exceso a M, seguiremos el siguiente proceso: 1) Codificar el número −85,3(10 · 102 en base 2. El número −85,3(10 · 102 lo podemos escribir como −8530(10. Si aplicamos el método de cambio de base basado en divisiones sucesivas, obtenemos que −8530(10 = − 10000101010010(2. 2) Normalizar la mantisa de la forma 1,x−1x−2x−3…: −10000101010010(2 = −1,0000101010010(2 · 213 3) Identificar el signo, el exponente y la mantisa. a) El número es negativo; por lo tanto, el bit de signo será 1: S = 1. b) La mantisa de este número es 1,0000101010010(2. El formato indica que trabajamos con bit implícito. Por lo tanto, la mantisa que hay que almacenar debería ser 000010101001. Esta mantisa no cabe en los 7 bits disponibles en el formato y, de este modo, la deberemos aproximar. Si utilizamos la técnica del truncamiento, los 7 bits que almacenaremos son 0000101. c) El exponente toma el valor 13. Errores máximos El error máximo del redondeo es la mitad del error máximo del truncamiento, pero computacionalmente es más costoso. 78 © FUOC • PID_00153515 Representación de la información numérica 4) Codificar en exceso a M el exponente. De los 16 bits del formato, 7 se utilizan para la mantisa y 1, para el signo. Quedan 8 para el exponente. Por lo tanto, si tomamos el exceso como 2q−1, el valor es 28−1 = 27 = 128. El 13(10 codificado en exceso a 128 es 13(10 + 128(10 = 141(10. Si aplicamos otra vez el método de cambio de base basado en divisiones sucesivas, encontramos que el 141(10 en base 2 es el 10001101(2. Por lo tanto, e = 10001101. 5) Juntar las codificaciones del signo, exponente y mantisa en el orden de precedencia correcto (S – e − R) para obtener la representación final: S 1 Exponente 1 0 0 0 1 Mantisa 1 0 1 0 0 0 0 1 0 1 6) Analizar el error. Hemos hecho un truncamiento de la mantisa donde hemos perdido los bits significativos para la representación. Por lo tanto, el número representado no corresponde exactamente al número que queríamos representar. Para calcular el error cometido, debemos calcular la distancia entre el número que queríamos representar y el número que realmente hemos representado. El número que hemos representado es: −1,0000101(2 · 213 = −8512(10 mientras que el número que queríamos representar es el −8530(10. Por lo tanto, el error cometido es ⏐−8530(10 − (− 8512(10)⏐ = 28(10. Para encontrar el valor decimal representado por −1,0000101(2 · 213 debemos hacer un cambio de base aplicando el TFN. Por lo tanto, la codificación del número −85,3(10 · 102 en el formato binario de coma flotante especificado es 1100011010000101 y el error cometido en la representación es 28(10. Desbordamiento en coma flotante Los números fuera del rango de representación no son representables. Como ejemplo, intentamos codificar el número +2345(10 en un formato de coma flotante de 8 bits, con mantisa normalizada de 3 bits y exponente de 4 bits en exceso a 8: 1) Codificamos el número 2345(10 en base 2. Si aplicamos el método de cambio de base basado en divisiones sucesivas, obtenemos que 2345(10 = 100100101001(2. 2) Normalizamos la mantisa de la forma 1,x−1x−2x−3…: 100100101001(2 = 1,00100101001(2 · 211. 3) Identificamos el signo, el exponente y la mantisa. a) El número es positivo; por lo tanto, el bit de signo será 0: S = 0. b) La mantisa de este número es 1,00100101001. El formato indica que traba- jamos con una mantisa de 3 bits y bit implícito. Truncaremos la mantisa en los 3 bits que podemos almacenar, de manera que nos queda 001. c) El exponente toma el valor 11(10. 4) Codificamos en exceso a 8 el exponente: El 11(10 codificado en exceso a 8 es 11(10 + 8(10 = 19(10. Si volvemos a aplicar el método de cambio de base basado en divisiones sucesivas, encontramos que el 19(10 en base 2 es el 10011(2. Por lo tanto, e = 10011. Cambio de base Para pasar a base 2 el 2345(10 hacemos divisiones sucesivas: 2345 = 1172 · 2 + 1 1172 = 586 · 2 + 0 1586 = 293 · 2 + 0 1293 = 146 · 2 + 1 1146 = 73 · 2 + 1 1173 = 36 · 2 + 0 1136 = 18 · 2 + 0 1118 = 9·2+0 1119 = 4·2+1 1114 = 2·2+0 1112 = 1·2+0 1111 = 0·2+1 2345(10 = 100100111001 (2 Cambio de base Para cambiar a base 2 el 19(10 hacemos divisiones sucesivas: 19 = 9 · 2 + 1 19 = 4 · 2 + 1 14 = 2 · 2 + 0 12 = 1 · 2 + 0 11 = 0 · 2 + 1 19(10 = 1110 (2 79 © FUOC • PID_00153515 Representación de la información numérica El exponente e = 10011 no se puede representar con los 4 bits disponibles. Por lo tanto, el número +2345(10 no se puede representar en el formato especificado ya que el exponente necesario está fuera del rango de representación del exponente. Este fenómeno recibe el nombre de desbordamiento del exponente. El desbordamiento del exponente se da cuando el exponente necesario para codificar un número en un formato de coma flotante supera el mayor valor representable por el exponente. Un fenómeno semejante se da cuando el exponente es demasiado pequeño. Intentemos codificar el número +0,00244140625(10 en un formato de coma flotante de 8 bits, con mantisa normalizada de 3 bits y exponente de 4 bits en exceso a 8: 1) Codificamos el número +0,00244140625(10 en base 2. Aplicamos el método de cambio de base basado en divisiones sucesivas y obtenemos que 0,00244140625 (10 = 0,00000000101(2. 2) Normalizamos la mantisa de la forma 1,x−1x−2x−3…: 0,00000000101(2 = 1,01(2 · 2−9 3) Identificamos el signo, el exponente y la mantisa. a) El número es positivo; por lo tanto, el bit de signo será 0: S = 0. b) La mantisa de este número es 1,01. El formato indica que trabajamos con una mantisa de 3 bits con bit implícito. Por lo tanto, nos queda 010. c) El exponente toma el valor −9. 4) Codificamos en exceso a 8 el exponente: El −9(10 codificado en exceso a 8 es −9 (10 + 8(10 = −1(10. Este número es negativo y, por lo tanto, está fuera del rango de representación en exceso a 8 empleado en o por el exponente. La codificación −1(10 para el exponente en exceso a 8 no es válida. Obtenemos esta codificación porque el valor del exponente es demasiado pequeño para poder ser representado en exceso a 8. Este fenómeno recibe el nombre de desbordamiento a cero del exponente. El desbordamiento a cero del exponente se da cuando el exponente necesario para codificar un número en un formato de coma flotante es inferior al menor valor representable por el exponente. Cambio de base Para pasar a base 2 el 0,00244140625 (10 hacemos multiplicaciones sucesivas: 0,00244140625 · 2 = = 0,0048828125 + 0 0,0048828125 · 2 = = 0,009765625 + 0 0,009765625 · 2 = = 0,01953125 + 0 0,01953125 · 2 = = 0,0390625 + 0 0,0390625 · 2 = 0,078125 + 0 0,078125 · 2 = 0,15625 + 0 0,15625 · 2 = 0,3125 + 0 0,3125 · 2 = 0,625 + 0 0,625 · 2 = 0,25 + 1 0,25 · 2 = 0,5 + 0 0,5 ·2=0+1 0,00244140625 (10 = = 0,00000000101(2 80 © FUOC • PID_00153515 2.5.3. Suma en coma flotante La suma directa de los números en coma flotante +1,34(10 · 101 y +45,2(10 · 10−3 es complicada. La dificultad reside en el hecho de que no sabemos qué dígitos debemos sumar. Para facilitar la tarea, hay que llevar a cabo una operación previa que consiste en igualar los exponentes. En este sentido, cambiamos la representación del número menor de manera que el exponente coincida con el exponente del número mayor. De este modo, podremos hacer la suma sin dificultades. En el caso de los números +1,34(10 · 101 y +45,2(10 · 10−3, transformaremos la representación del +45,2(10 · 10−3 para que el exponente sea 1: +45,2(10 · 10−3 = 0,00452(10 · 101 A continuación, podremos hacer la operación de suma: + 1 , 3 4 0 0 0 (10 · 101 0 , 0 0 4 5 2 (10 · 101 1 , 3 4 4 5 2 (10 · 101 ← resultado Finalmente, deberemos ajustar el exponente para conseguir colocar la coma en la posición deseada. Por ejemplo, 13,4452(10 · 100. Suma de dos números codificados en una representación de coma flotante normalizada y binaria Para sumar los números 01010101 y 00011001 que están en un formato de coma flotante de 8 bits con 3 bits para la mantisa normalizada y con bit implícito, procederemos de la manera siguiente: 1) Descodificar los números. Si seguimos el procedimiento de descodificación, encontraremos que en este formato de coma flotante el 01010101 represnta el +1,0101(2 · 21 y el 00011001 represnta el +1,1001(2 · 2−3. 2) Igualar exponentes. Cambiamos la representación del número menor (el +1,1001(2 · 2−3) para que tenga el mismo exponente que el número grande (que es 21): +1,1001(2 · 2−3 = 0,00011001(2 · 21. 3) Sumar las mantisas. ← transportes 1 0 , 0 0 0 1 1 0 0 1 (2 · 21 + 1 , 0 1 0 1 0 0 0 0 (2 · 21 1 , 0 1 1 0 1 0 0 1 (2 · 21 ← resultado El resultado de la suma tiene más bits que los disponibles en la representación. Esto hace que este resultado no se pueda almacenar de manera exacta. Por este motivo, será necesario aproximar el resultado. Si trabajamos con truncamiento, el resultado de la suma se Representación de la información numérica 81 © FUOC • PID_00153515 Representación de la información numérica almacenará como 1,0110(2 · 21. La codificación de este número en el formato especificado es 00010110(2. Es habitual que el resultado de las operaciones entre números en coma flotante no se pueda representar de manera exacta. Esto hace que se introduzca un error de representación cada vez que se lleva a cabo una operación aritmética. El error que se introduce aquí es menor que la precisión de la representación. El ejemplo anterior muestra la operación de suma de números en coma flotante. La operación de resta sigue las mismas pautas en lo que respecta a la necesidad de igualar los exponentes para llevar a cabo la operación. a Representaciones estandarizadas en coma flotante En las representaciones de coma flotante no hay ninguna manera natural de elegir el tamaño de los diferentes elementos (exponente y mantisa). Podríamos elegir cualquier manera de hacerlo. El hecho de elegir una representación El uso de representaciones estándares favorece el intercambio de información entre organismos distintos. que nos guste implica que la representación se adaptará mejor a los números reales con los que nos interesa trabajar. En contrapartida, dificulta notablemente el intercambio de información entre diferentes representaciones y, en definitiva, entre diferentes personas y organizaciones. Por este motivo, generalmente se utilizan representaciones estándares, es decir, con número de bits para el exponente y para la mantisa predeterminados. La representación de coma flotante más extendida es la definida por la norma IEEE754 del IEEE. Esta norma define dos representaciones de coma flotante con mantisa normalizada (de la forma 1,x−1…x−k) y bit implícito, que son utilizadas en la mayoría de los computadores de la actualidad. Estas representaciones son las que se presentan en la siguiente tabla: Nombre Bits Bits exponente Exceso exponente Single (precisión sencilla) 32 8 127 Double (precisión doble) 64 11 1023 Estas representaciones se recogen directamente en los principales lenguajes de programación. De esta manera, en el lenguaje C la representación de precisión sencilla recibe el nombre de float, mientras que la representación doble recibe el nombre de double. IEEE El IEEE (Institute of Electrical and Electronic Engineers) es una organización profesional de origen norteamericano dedicada, entre otras cosas, a definir y formalizar estándares industriales. Otras representaciones Hay otras representaciones definidas por el IEEE en las que se utiliza un número mayor de bits. Son las denominadas representaciones de precisión extendida. Además de definir los formatos, la norma define también distintas cuestiones de carácter práctico, como por ejemplo los procedimientos para llevar a cabo las operaciones (suma, resta, redondeo, truncamiento, etc.) y los mecanismos de detección de problemas (desbordamiento, desbordamiento a cero del exponen- Las representaciones estándares incluyen mecanismos para representar números especiales. 82 © FUOC • PID_00153515 Representación de la información numérica te, etc.). También define una cuestión muy relevante, como son los mecanismos de representación de algunos números especiales. Dos de estos números especiales son el cero y el infinito. Si analizamos cuidadosamente una representación de coma flotante normalizada, como por ejemplo la de precisión sencilla, el número con menor valor absoluto que se puede representar es aquel que tiene la menor mantisa y el exponente más negativo, es decir, el: 1,00…00(2 · 2−127 Por lo tanto, no es posible representar el cero directamente. El cero es un número que tiene una relevancia especial, por lo cual conviene buscar alguna manera de representarlo. Por convenio, se ha decidido que el menor número que se puede representar hará el papel del cero. Si analizamos cuál es la forma que presenta este número en forma binaria, se observa que es (en el caso de una representación de precisión sencilla) la siguiente: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Está compuesto únicamente por ceros y es una representación lo bastante natural para el número 0. Hay que tener en cuenta que el cero tiene una representación doble. La codificación 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 que corresponde al cero con signo negativo también representa al cero. Otro símbolo un poco especial es el infinito. No se trata de un número estrictamente, pero se obtiene como resultado de algunas operaciones, como por ejemplo: ∞= 1 0 La norma ha elegido como representación de este símbolo la siguiente codificación: 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 es decir, el máximo exponente y la mínima mantisa. La gestión de estos casos especiales y de todos los fenómenos numéricos que pueden ocurrir durante las diferentes operaciones implica la construcción de hardware y algoritmos especiales capaces de gestionarlos. Este tipo de hardware presenta, en general, una complejidad mucho más elevada que la exis- © FUOC • PID_00153515 83 tente en el hardware construido para gestionar las representaciones de coma fija. Actividades 44. Encontrad el valor decimal que codifican las cadenas de bits siguientes, interpretando que se trata de números en un formato de coma flotante de 8 bits con mantisa normalizada de la forma 1,X y con bit implícito: a) 11110010, donde la mantisa es de 4 bits. b) 01010011, donde la mantisa es de 3 bits. 45. Haced las siguientes codificaciones: a) El número −1,335(10 en coma flotante de 8 bits, mantisa de 3 bits normalizada de la forma 1,X y con bit implícito. Haced una aproximación por truncamiento. b) Repetid el apartado anterior, pero con una aproximación por redondeo. c) El número 10,0327(10 en coma flotante de 9 bits, mantisa de 3 bits normalizada de la forma 1,X y con bit implícito. Haced una aproximación por truncamiento. d) Repetid el apartado anterior, pero con una aproximación por redondeo. e) El número −2(10 · 103 en coma flotante de 8 bits, mantisa de 4 bits normalizada de la forma 1,X y con bit implícito. Haced una aproximación por redondeo. f) El número 10(10 · 105 en coma flotante de 8 bits, mantisa de 3 bits normalizada de la forma 1,X y con bit implícito. Haced una aproximación por redondeo. g) El número 2(10 · 10−6(10 en coma flotante de 8 bits, mantisa de 4 bits normalizada de la forma 1,X y con bit implícito. Haced una aproximación por truncamiento. h) El número −0,0001233(10 en coma flotante de 8 bits, mantisa de 3 bits normalizada de la forma 1,X y con bit implícito. Haced una aproximación por truncamiento. 46. Encontrad la precisión y el error de representación para cada uno de los apartados de la actividad 45. 47. Determinad el mayor número representable en los siguientes formatos: a) Coma flotante de 16 bits, con mantisa normalizada de la forma 1,X, bit implícito y 5 bits para el exponente. b) Coma flotante de 10 bits, con mantisa normalizada de la forma 1,X, bit implícito y 6 bits para el exponente. 48. Determinad si el número 2,89(10 · 1010 es representable en un formato de coma flotante de 16 bits, con mantisa normalizada de la forma 1,X, bit implícito y 5 bits para el exponente. 49. Determinad si el número −1256(10 · 102 es representable en un formato de coma flotante de 10 bits, con mantisa normalizada de la forma 1,X, bit implícito y 6 bits para el exponente. 50. Determinad el rango de representación en dos intervalos (rango de los positivos más rango de los negativos) de los siguientes formatos: a) Coma flotante de 16 bits, con mantisa normalizada de la forma 1,X, bit implícito y 5 bits para el exponente. b) Coma flotante de 10 bits, con mantisa normalizada de la forma 1,X, bit implícito y 6 bits para el exponente. 51. Haced las siguientes sumas. Considerad que los números están en formato de coma flotante de 8 bits, con mantisa normalizada de la forma 1,X, bit implícito y 5 bits para el exponente: a) 00110010 + 00110101 b) 10100101 + 10100100 c) 11110010 + 10111011 Representación de la información numérica 84 © FUOC • PID_00153515 Representación de la información numérica 3. Otros tipos de representaciones En los apartados precedentes se exponen diferentes sistemas para representar valores numéricos. Cada uno de estos sistemas tiene ventajas e inconvenientes, y hay que seleccionar el sistema de representación adecuado para cada caso. Todos los sistemas presentados están dirigidos a la representación de valores numéricos. Ahora bien, dentro de los computadores, éste no es el único tipo de información con el que se trabaja. En los apartados siguientes, se presentan algunos tipos de representación con utilidades distintas de la representación de valores numéricos o alfanuméricos. 3.1. Empaquetamiento de la información Compartir, anotar o analizar información de números codificados en algún tipo de formato binario es habitual cuando se trabaja en aplicaciones relacionadas con los computadores. Por ejemplo, en coma flotante normalizada de 16 bits, con 7 bits de mantisa y bit implícito, el número 0,169921875(10 se codifica de la manera siguiente: 0011111010101110 Dentro de los computadores, procesar una cadena de 16 bits como ésta no presenta dificultades. Ahora bien, trabajarla manualmente es complicado y hace es cometer errores. El simple hecho de memorizarla pone de manifiesto estas dificultades. Para trabajar con este tipo de datos, sería muy conveniente encontrar formas más compactas de escribirlos. Una manera sencilla de conseguir una representación más compacta de esta información es condensar la tira de bits en dígitos hexadecimales. Recordemos la relación que hay entre base 2 y base 16 (16 = 24) y la manera directa de cambiar entre estas bases. Para compactar esta cadena de bits, la dividiremos en grupos de 4 bits. Cada grupo se puede codificar directamente como un dígito hexadecimal. La cadena de dígitos hexadecimales es un número natural en base 16. En la figura siguiente, se muestra el procedimiento: Los cambios de base entre estas codificaciones se explican en el subapartado 1.3.3 de este módulo. 85 © FUOC • PID_00153515 Representación de la información numérica Habitualmente, se coloca el símbolo h al final de la cadena de dígitos para indicar que son dígitos hexadecimales. a Esta manera de compactar información binaria en cadenas de dígitos hexadecimales se denomina empaquetamiento hexadecimal. El empaquetamiento hexadecimal consiste en compactar información binaria en cadenas de dígitos hexadecimales y permite tener una representación más compacta de la información. El empaquetamiento hexadecimal es muy utilizado en diferentes ámbitos relacionados con los computadores para facilitar el trabajo con números, instrucciones y direcciones de memoria. Este tipo de empaquetamiento se utiliza sobre cadenas de bits, independientemente del sentido que tengan los bits dentro de la cadena. a Empaquetamiento de una cadena de bits Para empaquetar la cadena de bits 010100100011, procederemos de la manera siguiente: 1) Dividir la cadena en grupos de 4 bits: 0101 − 0010 − 0011. 2) Codificar cada grupo como un dígito hexadecimal: 5 − 2 − 3. La cadena de dígitos hexadecimales que resulta es 523h. Si empaquetamos en hexadecimal la cadena de bits 010100100011, se obtiene la codificación hexadecimal 523h. El proceso de empaquetamiento en hexadecimal es reversible. Se puede conocer la cadena de bits empaquetada en dígitos hexadecimales si convertimos cada dígito hexadecimal en un grupo de 4 bits, tal y como se describe en el subapartado 1.3.3. Desempaquetamiento Para desempaquetar la cadena 3ACh seguiremos el siguiente procedimiento: 1) Convertir cada dígito hexadecimal en un grupo de 4 bits: 3(16 = 0011(2 A(16 = 1010(2 C(16 = 1100(2 2) Juntamos los grupos de 4 bits en una única cadena de bits, y conservamos el orden de precedencia de los dígitos hexadecimales, con lo cual obtenemos: 0011 1010 1100. La cadena 3ACh de dígitos hexadecimales empaqueta la cadena de bits 001110101100. El proceso de desempaquetamiento nos devuelve la cadena de bits que se había empaquetado, pero no nos da información sobre su sentido. Sólo podemos interpretar una cadena de bits si conocemos su formato de representación. a Cada dígito hexadecimal da lugar a 4 bits. De este modo, el dígito hexadecimal 4 genera el grupo de 4 bits 0100 y no el 100. 86 © FUOC • PID_00153515 Según la clave de interpretación, la misma cadena de bits codifica informaciones distintas. Por ejemplo, la cadena de bits 001110101100 puede tener diferentes interpretaciones: 1) Si se trata de un número natural, sabremos, si aplicamos el TFN, que: 001110101100(2 = 940(10 2) Si se trata de un número fraccionario en coma fija de 6 bits fraccionarios sabremos, si aplicamos el TFN, que: 001110,101100(2 = 14,6875(10 3) Si se trata de un número en coma flotante normalizada donde hay 4 bits para codificar el exponente y con bit implícito, sabremos que: a) El primer bit codifica el signo. Por lo tanto, se trata de un número positivo. b) Los 4 bits siguientes (0111) codifican el exponente. El 0111(2 es el 7(10. Si asumimos que está en exceso a 23, el exponente es 7(10 − 23 (10 = −1(10. c) El resto de los bits 0101100 codifican la mantisa normalizada. En este for- mato, la mantisa es 1,0101100(2, que en decimal es 1,34375(10. Con todo esto, podemos concluir que el número codificado por la cadena de bits 001110101100 es: 1,34375(10 · 2−1 = 0,671875(10 3.2. Representación de la información alfanumérica La representación alfanumérica se utiliza para describir información no numérica. La función principal es la representación de la información textual, que incluye letras, cifras y símbolos que agrupamos genéricamente con el nombre de caracteres. A la hora de establecer una correspondencia entre el carácter y una codificación, hay que utilizar criterios que faciliten el tratamiento de los datos, como por ejemplo la asignación de códigos en orden creciente a las letras del alfabeto para permitir una ordenación alfabética fácil. El número de caracteres que hay que representar puede ser relativamente grande si consideramos el conjunto de símbolos que usamos de manera habitual: mayúsculas, minúsculas, vocales acentuadas, símbolos de puntuación y matemáticos, etc. Representación de la información numérica 87 © FUOC • PID_00153515 Representación de la información numérica La codificación más extendida es el código ASCII. Este código tiene una versión básica de 128 símbolos que forma el estándar de facto que utilizan la mayoría de los computadores, y una versión extendida, no tan estandarizada, que incluye 128 símbolos más. En la versión extendida, se utilizan 8 bits para codificar los 256 símbolos que incluye. En la tabla siguiente, podemos ver la asignación del código ASCII. La representación numérica asociada a cada símbolo se obtiene a partir de sus coordena- ASCII es la sigla de la expresión inglesa American standard code for information interchange. das. El índice de columna es el dígito decimal menos significativo, y el de fila, el más significativo. Por ejemplo, el carácter alfanumérico 3 se representa por el valor decimal 51(10 (5u, d1), que es en binario el 00110011(2. u d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 0u NULL SOH STX ETX EOT ENQ ACK BEL BS HT 1u LF VT FF CR SO SI DLE DC1 DC2 DC3 2u DC4 NAK SYN ETB CAN EM SUB ESC FS GS 3u RS US SP ! “ # $ % & ‘ 4u ( ) * + , - . / 0 1 5u 2 3 4 5 6 7 8 9 : ; 6u < = > ? @ A B C D E 7u F G H I J K L M N O 8u P Q R S T U V W X Y 9u Z [ \ ] ^ _ ` a b c 10u d e f g h i j k l m 11u n o p q r s t u v w 12u x y z { | } ~ DEL d Los primeros 31 códigos y el último no corresponden a símbolos del lenguaje o caracteres visualizables (el carácter 32 –identificado como SP– representa el espacio en blanco). Estos códigos son caracteres de control utilizados para dar formato al texto o como comandos para los dispositivos periféricos (terminales alfanuméricos o gráficos, impresoras, etc.). Carácteres de control no visualizables Algunos caracteres de control no visualizables son: DEL (borrar), ESC (escapada), HT (tabulador horizontal), LF (final de línea), CR (retorno a primera columna), FF (final de página), STX (inicio de texto) o ETX (final de texto). Como consecuencia del incremento del uso de la informática y de la portabilidad e interoperabilidad de los computadores para trabajar con distintas lenguas simultáneamente, es cada vez más popular la extensión de la representación ASCII de los caracteres alfanuméricos a 2 bytes, que utiliza el estándar denominado Unicode y que incluye los alfabetos del resto de los idiomas y grafías más importantes. Hay que tener en cuenta esta propiedad a la hora de elaborar textos que deban ser utilizables globalmente, por ejemplo en Internet, ya que en caso de utilizar versiones de un byte, se pueden ver alteradas sus características particulares (acentos, etc.). El formato Unicode El formato Unicode es estandarizado por la ISO/IEC, (Organización Internacional de Normalización / Comisión Electrotécnica Internacional o en inglés, International Organization for Standardization / International Electrotechnical Commission) con el identificador 10646. 88 © FUOC • PID_00153515 Los códigos ASCII correspondientes a los símbolos escritos (no a los caracteres de control) se pueden construir fácilmente si añadimos 00h a la izquierda de los códigos actuales expresados con 8 bits. Las operaciones sobre caracteres se efectúan sobre agrupaciones de éstos que se denominan cadenas de caracteres. Operación sobre cadenas de caracteres ASCII Queremos expresar la operación binaria que hay que hacer sobre un código ASCII para convertir una letra en mayúsculas en el equivalente en minúsculas. De entrada, vemos que los códigos consecutivos a partir del código 65 siguen el orden de las letras del alfabeto inglés tanto para las mayúsculas como, a partir del código 97, para las minúsculas. Por lo tanto, la distancia entre símbolos de mayúsculas y minúsculas es constante. Fijémonos, por ejemplo, en las dos versiones de la primera letra del alfabeto. El carácter A tiene el código 65, mientras que el de a es 97. La diferencia es de 32(10, que en binario y 8 bits es 00100000. Por lo tanto, para transformar el código ASCII de una letra en mayúscula al correspondiente código ASCII de la misma letra en minúscula, deberemos restar 32(10, o lo que es lo mismo, tenemos que restar 00100000(2 al código ASCII en binario. 3.3. Representación BCD Nuestra aritmética cotidiana se desarrolla en base 10. De este modo, solemos trabajar con números de la forma 104(10, 745(10 o 214(10. En diferentes apartados de este módulo, se describen maneras de representar estos números en base 2. No se contempla en los sistemas que se presentan, sin embargo, la posibilidad de mantener la estructura de esta representación; es decir, representar directamente los dígitos de la codificación decimal. Esta codificación debe ser en binario, ya que dentro de los computadores sólo se utiliza la base 2. Los dígitos decimales son 10, del 0 al 9. Para representar en binario estos diez dígitos, se necesitan 4 bits. La siguiente tabla muestra la codificación para los dígitos decimales en binario. Dígito decimal Codificación binaria 0 0000 1 0001 2 0010 3 0011 4 0100 5 0101 6 0110 7 0111 8 1000 9 1001 Representación de la información numérica El estándar Unicode El almacenamiento de textos con formato Unicode está presente en muchos de los procesadores de textos actuales como, por ejemplo, Wordpad de Windows. 89 © FUOC • PID_00153515 La siguiente figura muestra la manera en la que podemos representar un número decimal si codificamos cada dígito de manera individual: La codificación binaria dígito a dígito de los números decimales aprovecha parcialmente la capacidad de representación. El código 1100, por ejemplo, no se utiliza. De las dieciséis combinaciones posibles que se pueden hacer con 4 bits, sólo se utilizan diez. Consiguientemente, son necesarios más bits para representar un mismo número que si utilizáramos una representación binaria. La conversión a este tipo de representación es habitual en dispositivos de salida que tienen que servir para visualizar datos. La codificación binaria dígito a dígito de los números decimales se conoce con la sigla BCD (binary coded decimal). a La representación BCD consiste en codificar en binario los dígitos decimales de una representación de manera individual. El hecho de que los dígitos estén codificados en binario individualmente no cambia el hecho de que se trata de números decimales. Las operaciones de suma y resta se desarrollarán como en el caso de base 10. De hecho, lo único que se está haciendo en esta forma de representación es cambiar el símbolo que usamos para designar un dígito decimal por un código binario que tiene la misma función. Se puede entender como un cambio de la simbología para representar los dígitos. Actividades 52. Empaquetad en hexadecimal el número natural 10110001(2. 53. Empaquetad en hexadecimal el número 0100000111111010(2 que está en un formato de coma flotante normalizada de 16 bits, de los cuales 6 son de exponente y con bit implícito. 54. Codificad el número 1,125(10 en una representación binaria de coma fija sin signo de 12 bits de los cuales 8 bits son fraccionarios, y después empaquetadlo en hexadecimal. 55. Desempaquetad la cadena de bits A83h e interpretadla sabiendo que es un número natural. 56. Desempaquetad la cadena de bits A83h e interpretadla sabiendo que es un número de coma flotante normalizada de 12 bits y 4 bits para el exponente. 57. Desempaquetad la cadena de bits B5h e interpretadla sabiendo que es un número entero codificado en exceso a 10. Representación de la información numérica © FUOC • PID_00153515 90 58. Codificad en BCD el número 125(10. 59. Codificad en BCD el número 637(10. 60. Indicad qué número codifica la siguiente representación BCD: 00010011100. 61. Codificad el número 427(10 en BCD y en binario. Comparad el número de bits necesario en los dos casos. Representación de la información numérica © FUOC • PID_00153515 91 Resumen En este módulo, se presenta un análisis de los sistemas de numeración posicionales y se exponen las maneras de representar valores numéricos que es habitual utilizar dentro de los computadores. Los puntos principales que se tratan en este módulo son: • El TFN y los algoritmos de divisiones sucesivas y de multiplicaciones sucesivas que permiten cambiar entre bases distintas la representación de un valor numérico. • La representación de números naturales con representaciones posicionales utilizando base 2 (binario), base 16 (hexadecimal) y base 10 (decimal), y también las operaciones de suma y resta de números naturales. • Las limitaciones derivadas de los condicionamientos físicos de los computadores y las características que presentan los distintos formatos de representación (rango y precisión), y también el fenómeno de desbordamiento y las técnicas de aproximación. • La codificación de los números enteros a partir de las representaciones en complemento a 2, signo y magnitud y exceso a M, y las operaciones de suma y resta en cada una de estas codificaciones. • La codificación de números fraccionarios con y sin signo en coma fija. • La codificación de números en coma flotante. • El empaquetamiento de información en hexadecimal y la codificación en BCD. Representación de la información numérica © FUOC • PID_00153515 92 Representación de la información numérica © FUOC • PID_00153515 93 Ejercicios de autoevaluación 1. Codificad en complemento a 2, signo y magnitud y exceso a 128 el número −10(10 utilizando 8 bits. 2. Determinad el valor decimal que codifica la cadena de bits 00100100 en los siguientes supuestos: a) Si se trata de un número codificado en complemento a 2. b) Si se trata de un número codificado en signo y magnitud. c) Si se trata de un número codificado en exceso a 128(10. 3. Sumad en binario los números 111010101100(2 y 11100010010(2. Analizad el resultado obtenido. 4. Codificad en un formato de coma fija de 8 bits donde 3 son fraccionarios y signo y magnitud el número +12,346(10. Si es necesario, utilizad una aproximación por truncamiento. 5. Codificad en un formato de coma flotante de 8 bits con mantisa de 3 bits normalizada de la forma 1,X con bit implícito, y exponente en exceso a M con M = 2q−1 (donde q es el número de bits del exponente), el número +12,346(10. Si es necesario, usad una aproximación por truncamiento. 6. Codificad en una representación BCD el número 178(10. 7. Determinad el valor decimal que representa el código 378h, sabiendo que se trata de un número en coma flotante de 12 bits con mantisa de 4 bits normalizada de la forma 1,X y bit implícito, exponente en exceso a M con M = 2q−1 (donde q es el número de bits del exponente) y empaquetado en hexadecimal. 8. Codificad en un formato de 8 bits y complemento a 2 el número −45(10 y, posteriormente, empaquetadlo en hexadecimal. 9. Determinad el número mínimo de bits enteros y fraccionarios necesarios en coma fija y signo y magnitud para codificar el número −35,25(10. 10. Codificad los números +12,25(10 y el +32,5(10 en un formato de coma fija y signo y magnitud de 9 bits de los cuales 2 son fraccionarios y sumadlos. Representación de la información numérica 94 © FUOC • PID_00153515 Solucionario Actividades 1. a) 46(7 = 4 · 71 + 6 · 70 = 28 + 6 = 34(10 b) 3AD(16 = 3 · 162 + A · 161 + D · 160 = 3 · 162 + 10 · 161 + 13 · 160 = 941(10 ↑ ↑ Correspondencia del dígito A en base 10 Dígito D en base 10 c) 10011101(2 = 1 · 27 + 0 · 26 + 0 · 25 + 1 · 24 + 1 · 23 + 1 · 22 + 0 · 21 + 1 · 20 = = 128 + 16 + 8 + 4 + 1 = 157(10 d) 333(4 = 3 · 42 + 3 · 41 + 3 · 40 = 48 + 12 + 3 = 63(10 e) 333(8 = 3 · 82 + 3 · 81 + 3 · 80 = 192 + 24 + 3 = 219(10 f) B2,3(16 = B · 161 + 2 · 160 + 3 · 16−1 = 11 · 161 + 2 · 160 + 3 · 16−1 = = 176 + 2 + 0,1875 = 178,1875(10 g) 2232,02(4 = 2 · 43 + 2 · 42 + 3 · 41 + 2 · 40 + 0 · 4−1 + 2 · 4−2 = = 128 + 32 + 12 + 2 + 0 + 0,125 = 174,125(10 h) 2464,1(8 = 2 · 83 + 4 · 82 + 6 · 81 + 4 · 80 + 1 · 8−1 = 1024 + 256 + 48 + 4 + 0,125 = 1332,125(10 i) 1110100,01101(2 = 1 · 26 + 1 · 25 + 1 · 24 + 0 · 23 + 1 · 22 + 0 · 21 + 0 · 20 + 0 · 2−1 + 1 · 2−2 + + 1 · 2−3 + 0 · 2−4 + 1 · 2−5 = 64 + 32 + 16 + 4 + 0,25 + 0,125 + 0,03125 = 116,40625(10 2. a) 3245(8 → X(10 3245(8 = 3 · 83 + 2 · 82 + 4 · 81 + 5 · 80 = 1536 + 128 + 32 + 5 = 1701(10 b) 425(10 → X(2 Dividiremos el valor numérico 425 por 2 sucesivamente, y registraremos los restos de las divisiones enteras. Estos restos constituyen los dígitos binarios: 425 212 106 53 26 cocientes → 13 6 3 1 0 1 ← restos 0 0 1 0 1 0 1 1 Por lo tanto: 425(10 = 110101001(2 c) AC3C(16 → X(10 AC3C(16 = A · 163 + C · 162 + 3 · 161 + C · 160 = = 10 · 163 + 12 · 162 + 3 · 161 + 12 · 160 = = 40,960 + 3,072 + 48 + 12 = 44,092(10 d) 45367(10 → X(16 Dividiremos el valor numérico 45367 por 16 sucesivamente, y registraremos los restos de las divisiones enteras hechas. Estos restos constituyen los dígitos hexadecimales: 45367 2835 177 11 0 Por lo tanto: 45367(10 = B137(16 7 3 1 11 Representación de la información numérica 95 © FUOC • PID_00153515 Representación de la información numérica e) 344(10 → X(2 344 172 86 43 21 10 5 2 1 0 0 0 0 1 1 0 1 0 1 Por lo tanto: 344(10 = 101011000(2 3. a) 111010011,1110100111(2 → X(16 Base 2 0001 1101 0011, 1110 1001 1100 Base 16 1 D 3, E 9 C Por lo tanto: 111010011,1110100111(2 = 1D3,E9C(16 b) 0,1101101(2 → X(16 Base 2 0000 1101 1010 Base 16 0, D A Por lo tanto: 0,1101101(2 = 0,DA(16 c) 111011,1010010101(2 → X(16 Base 2 0011 1011, 1010 0101 0100 Base 16 3 B, A 5 4 Por lo tanto: 111011, 1010010101 (2 = 3B,A54(16 4. Como se puede ver, el valor numérico que en base 10 se representa por 74,3(10, con una representación en base 2, 8 y 16 tiene un número infinito de dígitos fraccionarios. En todos estos casos, obtenemos una parte fraccionaria periódica. Binario Octal Hexadecimal Decimal 1101100,110 154,6 6C,C 108,75 11110010,010011 362,23 F2,4C 242,296875 10100001,00000011 241,006 A1,03 161,01171875 1001010,0100110011… 112,2314631463… 4A,4CCCCC… 74,3 5. Podemos aprovechar la propiedad de que 16 = 24 y 16 = 42 para tratar el paso de base 16 a base 2 y a base 4 dígito a dígito. Es decir, cada dígito hexadecimal se transformará en un conjunto de cuatro dígitos binarios, mientras que cada dígito hexadecimal se puede transformar en dos dígitos en base 4. El paso a base 8 no se puede hacer directamente desde base 16, dado que 16 no es potencia de 8. Aprovecharemos la base 2 como base intermedia. 8 es potencia de 2 (8 = 23) y, por lo tanto, tenemos una correspondencia directa: cada agrupación de tres dígitos se corresponderá con un dígito octal. a) ABCD(16 → X(2, X(4, X(8 Base 16 A B C D Base 2 1010 1011 1100 1101 Base 4 22 23 30 31 96 © FUOC • PID_00153515 Representación de la información numérica Base 2 0011 010 101 111 001 101 Base 8 1 2 5 7 1 5 Por lo tanto: ABCD(16 = 1010101111001101(2 = 22233031(4 = 125715(8 b) 45,45(16 → X(2, X(4, X(8 Base 16 4 5, 4 5 Base 2 0100 0101, 0100 0101 Base 4 10 11, 10 11 Base 2 001 000 101, 010 001 010 Base 8 1 0 5, 2 1 2 Por lo tanto: 45,45(16 = 1000101,01000101(2 = 1011,1011(4 = 105,212(8 c) 96FF,FF(16 → X(2, X(4, X(8 Base 2 001 001 011 011 111 111, 111 111 110 Base 8 1 1 3 3 7 7, 7 7 6 Base 16 9 6 F F, F F Base 2 1001 0110 1111 1111, 1111 1111 Base 4 21 12 33 33, 33 33 Por lo tanto: 96FF,FF(16 = 1001011011111111,11111111(2 = 21123333,3333(4 = 113377,776(8 6. a) 4365,14(10 → X(2 • Parte fraccionaria 0,14 · 2 = 0,28 · 2 = 0,56 · 2 = 0,12 · 2 = 0,24 · 2 = 0,48 · 2 = 0,96 · 2 = 0,92 · 2 = 0,84 · 2 = 0,68 · 2 = 0,36 · 2 = 0,72 · 2 = ... • Parte entera 0,28 = 0,56 = 1,12 = 0,24 = 0,48 = 0,96 = 1,92 = 1,84 = 1,68 = 1,36 = 0,72 = 1,44 = 0 0 1 0 0 0 1 1 1 1 0 1 + 0,28 + 0,56 + 0,12 + 0,24 + 0,48 + 0,96 + 0,92 + 0,84 + 0,68 + 0,36 + 0,72 + 0,44 4.365 2.182 1.091 545 272 136 68 34 17 8 4 2 1 0 1 0 1 1 0 0 0 0 1 0 0 0 1 Por lo tanto, si 0,14 (10 = 0,001000111101…(2 y 4365(10 = 1000100001101(2, entonces: 4365,14(10 = 4365(10 + 0,14(10 = 1000100001101(2 + 0,001000111101…(2 = = 1000100001101,001000111101…(2 b) 234,2(5 → X(2 Pasamos a base 10: 234,2(5 = 2 · 52 + 3 · 51 + 4 · 50 + 2 · 5−1 = 50 + 15 + 4 + 0,4 = 69,4(10 A continuación, hacemos las operaciones pertinentes para pasar a base 2: 97 © FUOC • PID_00153515 • Parte fraccionaria Representación de la información numérica • Parte entera 0,4 · 2 = 0,8 · 2 = 0,6 · 2 = 0,2 · 2 = 0,4 · 2 = … 0,8 = 1,6 = 1,2 = 0,4 = 0,8 = + 0,8 + 0,6 + 0,2 + 0,4 + 0,8 0 1 1 0 0 69 34 17 8 4 2 1 0 1 0 1 0 0 0 1 Por lo tanto, si 0,4 (10 = 0,01100110…(2 i 69(10 = 1000101(2, entonces: 234,2(5= 69,4(10 = 69(10 + 0,4(10 = 1000101(2 + 0,01100110…(2 = = 1000101,01100110…(2 c) 31,125(10 → X(2 • Parte fraccionaria • Parte entera 0,125 · 2 = 0,25 · 2 = 0,50 · 2 = 0,25 = 0,50 = 1,00 = 0 0 1 + 0,25 + 0,50 + 0,00 31 15 7 3 1 0 1 1 1 1 1 Por lo tanto, si 0,125 (10 = 0,001(2 y 31(10 = 11111(2, entonces: 31,125(10 = 11111,001(2 7. a) 10011001,1101(2 → X(10 10011001,1101(2 = 1 · 27 + 0 · 26 + 0 · 25 + 1 · 24 + 1 · 23 + 0 · 22 + 0 · 21 + + 1 · 20 + 1 · 2−1 + 1 · 2−2 + 0 · 2−3 + 1 · 2−4 = = 128 + 16 + 8 + 1 + 0,5 + 0,25 + 0,0625 = 153,8125(10 b) 110011,11(4 → X(10 110011,11(4 = 1 · 45 + 1 · 44 + 0 · 43 + 0 · 42 + 1 · 41 + 1 · 40 + 1 · 4−1 + 1 · 4−2 = = 1.024 + 256 + 4 + 1 + 0,25 + 0,0625 = = 1285,3125(10 c) 1010,11(8 → X(10 1010,11(8 = 1 · 83 + 0 · 82 + 1 · 81 + 0 · 80 + 1 · + 1 · 8−1 + 1 · 8−2 = = 512 + 8 + 0,125 + 0,015625 = = 520,140625(10 8. d. a. 1 + 1 1 1 1 1 1 ← transporte 1 1 1 0 1 1 0 1 0 (2 1 0 0 1 1 0 1 0 0 (2 1 0 0 0 0 1 1 1 0 (2 1 1 0 1 1 − 1 0 1 0 1 ← transporte (2 1 0 0 1 1 0 1 0 0 (2 0 1 0 1 0 0 1 1 0 (2 98 © FUOC • PID_00153515 b. Representación de la información numérica e. 2 + 2 3 4 5 (8 3 2 1 (8 6 6 6 (8 2 3 4 5 (8 3 2 1 (8 2 0 2 4 (8 F (16 − c. f. + 1 ← transporte A 2 3 1 1 ← transporte 5 4 A 3 (16 4 D 9 C (16 A 2 3 F (16 5 4 A 3 (16 F 6 E 2 (16 − 9. b. a. + 1 1 ← transporte 6 2, 4 8 (16 3 5, D F (16 9 8, 2 7 (16 c. 1 + 1 1 1 1 ← transporte 1 0 1, 1 1 0 0 1 0 0, 1 1 1 0 0 0 1 0, 1 0 1 1 1 (2 0 1 1 0 1, 1 1 0 1 1 (2 1 1 1 ← transporte 1 1 1 1 1 1 1 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 1 1 1 1 1 1 1 (2 (2 d. − 6 2, 4 8 1 1 1 ← transporte 3 5, D F (16 2 C, 6 9 (16 (16 − 1 0 0 1 1 0 1 0 0, 1 1 1 0 1 0 1 1 1 0 0 0, 1 1 1 10. La multiplicación de un número por bk donde b es la base de numeración, equivale a desplazar la coma fraccionaria k posiciones a la derecha. a) 128,7(10 · 104 = 128,7(10 · 10000(10 = 1287000(10 b) AFD(16 · 162 = AFD(16 · 100(16 = AFD00(16 c) 1101,01(2 · 22 = 1101,01(2 · 100(2 = 110101(2 11. La división de un número por bk donde b es la base de numeración equivale a desplazar la coma fraccionaria k posiciones a la izquierda. a) 52978(10 / 103 = 52978(10 / 1000(10 = 52,978(10 El cociente de la división entera es 52(10. El resto es 978(10. b) 3456(16 / 162 = 3456(16 / 100(16 = 34,56(16. El cociente de la división entera es 34(16. El resto es 56(16. c) 100101001001(2 / 28 = 100101001001(2 / 100000000(2 = 1001,01001001(2 El cociente de la división entera es 1001 (2. El resto es 01001001 (2. (2 1 1 (2 99 © FUOC • PID_00153515 12. Para escribir un número en notación científica, hay que identificar su mantisa, su base y su exponente. En este caso, podemos elegir la base 10 (base en la que está representado el número), podemos tomar como mantisa 12044,4 y el exponente 0. De este modo, una representación en notación científica del número +12044,4(10 es +12044,4(10 · 100. Algunas representaciones en notación científica equivalentes para este número son +1204,44(10 · 101 o +120444(10 · 10−1, entre otras. 13. Puesto que la representación científica es de la forma ±R · be, donde R es la mantisa, b la base y e el exponente, podemos concluir que la mantisa es R = 3,143(10, la base es b = 10 y el exponente es e = 45(10. 14. Para sumar dos números en notación científica, debemos igualar sus exponentes. Como norma, se suelen igualar al mayor exponente. El número con menor exponente se modifica para igualar el mayor exponente. En este caso, el mayor exponente es 5. Por lo tanto, transformamos el +123,34(10 · 103 : +123,34(10 · 103 = +1,2334(10 · 105 Una vez los dos números tienen el mismo exponente, se puede hacer la operación de suma: 1 1 (10 · 105 89 (10 · 105 +69 , 1234 (10 · 105 +1 , 2334 + +67 , 15. Para restar dos números en notación científica, tenemos que igualar sus exponentes. Como norma general, se suele igualar al mayor exponente. El número con menor exponente se modifica para igualar el mayor exponente. En este caso, el mayor exponente es 5. Por lo tanto, transformamos el +1223,34(10 · 10−2: +1223,34(10 · 10−2 = +0,000122334(10 · 105 Una vez los dos números tienen el mismo exponente, se puede hacer la operación de resta: (10 · 105 − +0 , 000122334 (10 · 105 +65 , 678777666 (10 · 105 +65 , 6789 11111 16. Dado que la base de numeración es 10, el rango de la representación del formato x1x0,x –1x –2x –3 es [0, 99,999 (10]. La precisión de este formato es 0,001 (10, porque ésta es la distancia entre dos números consecutivos representables en este formato, como por ejemplo el 12,121(10 y el 12,122(10. De una manera semejante, el rango de representación del formato x2x1x0,x–1x–2 es [0, 999,99(10], y su precisión es 0,01(10, la distancia entre dos números consecutivos representables en el formato, como por ejemplo el 45,77(10 y el 45,78(10. 17. El número 925,4(10 no se puede representar en el formato x1x0,x–1x–2x–3, ya que éste número está fuera del intervalo de representación. En cambio, se puede representar en el formato x2x1x0,x–1x–2 puesto que está dentro del rango [0, 999,99(10]. 18. Para escribir estos números en el formato indicado, hay que escribirlos con dos dígitos enteros y dos dígitos fraccionarios: a) 10(10 → 10,00(10 b) 10,02(10 → 10,02(10 c) 03,1(10 → 03,10(10 d) 03,2(10 → 03,20(10 19. La cantidad de números que se pueden representar en un determinado formato es bk donde k es el número de dígitos disponibles en el formato y b la base de numeración. Puesto que se trata de un formato decimal, cada dígito puede tomar diez valores distintos (0-9), y dado que el formato dispone de seis dígitos para la representación, podemos representar un total de 106 números. Observemos que la cantidad de números que se pueden representar no depende de la posición de la coma. Representación de la información numérica 100 © FUOC • PID_00153515 Representación de la información numérica 20. a) 22,345(10 El número 22,345(10 está directamente representado en el formato x2x1x0,x–1x–2. Por lo tanto, se trata de un número representable y el error cometido es cero. b) 45,89(10 El número 45,89(10, es representable directamente en el formato x2x1x0, x–1x–2. La representación es 045,89(10 y es exacta. Por lo tanto, el error de representación es cero. c) 55,6356(10 El número 55,6356(10 no se puede representar directamente en el formato x2x1x0, x–1x–2, dado que tiene cuatro dígitos fraccionarios. Deberemos hacer una aproximación, lo cual comporta un cierto error de aproximación. Con una aproximación por truncamiento, la representación será 55,635(10. El error de representación que se comete es ⏐55,6356(10 − 55,635(10⏐ = 0,0006(10. d) 23,56(10 El número 23,56(10, es representable directamente en el formato x2x1x0, x–1x–2. La representación es 023,56(10 y es exacta. Por lo tanto, el error de representación es cero. 21. Para representar este número en hexadecimal, primero lo pasaremos a binario. La representación binaria de 16,25(10, es 10000,01(2. Para la representación hexadecimal de este número, hay que añadir ceros a los extremos hasta disponer de grupos de 4 bits completos a lado y lado de la coma decimal. Entonces tenemos: 00010000,0100(2 = 10,4(16. Por lo tanto, la representación hexadecimal que necesitamos es x1x0,x–1 donde x son dígitos hexadecimales: El rango de esta representación es: [0 (00,0(16), 255,9375(10 (FF,F(16)]. • La precisión es: 0,0625(10 = 00,1(16 − 00,0(16. 22. Para que en una representación decimal de cuatro dígitos sin signo se produzca desbordamiento, debemos sobrepasar el número 9999(10; por lo tanto, tendremos desbordamiento cuando la suma de dos números sea 10000(10. Entonces, el menor número que debemos sumar a 8341(10 es 10000(10 − 8341(10 = 1659(10. 23. Pasamos los valores numéricos a binario: a. b. 53 26 13 6 3 1 0 c. 25 12 6 3 1 0 1 0 1 0 1 1 1 0 0 1 1 93 46 23 11 5 2 1 0 1 0 1 1 1 0 1 64 32 16 8 4 2 1 0 0 0 0 0 0 1 +53(10 = +110101(2 − 25(10 = −11001(2 + 93(10 = +1011101(2 d. e. 127 63 31 15 7 3 1 1 1 0 f. 1 1 1 1 1 1 −1(10 = −1(2 − 127(10 = −1111111(2 − 64(10 = −1000000(2 Para obtener la representación en signo y magnitud, sólo debemos poner el bit de signo y añadir la magnitud expresada en 7 bits: Base 10 Base 2 Signo y magnitud +53(10 +110101(2 00110101(2 −25(10 −11001(2 10011001(2 +93(10 +1011101(2 01011101(2 −1(10 −1(2 10000001(2 −127(10 −1111111(2 11111111(2 −64(10 −1000000(2 11000000(2 101 © FUOC • PID_00153515 Representación de la información numérica La representación en Ca2 de las magnitudes positivas coincide con la representación en signo y magnitud. La representación en Ca2 de las magnitudes negativas se puede obtener de distintas maneras: i) Se puede hacer la operación 28 − ⏐X⏐ en base 10, y pasar posteriormente el resultado a binario. ii) Podemos hacer la operación 28 − ⏐X⏐ directamente en base 2. iii) Se aplica un cambio de signo a la magnitud positiva en Ca2. a) El +53(10 = +110101(2 se representa por 00110101(2 en Ca2. b) Podemos obtener la representación en Ca2 del −25(10 de la siguiente manera: i) 28 − 25(10 = 256(10 − 25(10 = 231(10 = 11100111(2, o bien, ii) 28 − 25(10 = 100000000(2 − 11001(2 = 11100111(2, o bien, iii) +25(10 = +11001(2 → Representación de la magnitud positiva → 00011001(2 → → cambio de signo → 11100111(2 c) El +93(10 = +1011101(2 se representa por 01011101(2 en Ca2. d) Obtenemos la representación en Ca2 del −1(10: i) 28 – 1 = 256(10 − 1(10 = 255(10 = 11111111(2, o bien, ii) 28 – 1 = 100000000(2 – 1(2 = 11111111(2, o bien, iii) +1(10 = +1(2 → Representación de la magnitud positiva → 00000001(2 → → Cambio de signo → 11111111(2 e) La representación en Ca2 del −127(10 se puede obtener: i) 28 – 127 = 256(10 – 127(10 = 129(10 = 10000001(2, o bien, ii) 28 – 127 = 100000000(2 – 1111111(2 = 10000001(2, o bien, iii) +127(10 = +1111111(2 → Representación de la magnitud positiva → 01111111(2 → → Cambio de signo → 10000001(2 f) La representación en Ca2 del −64(10 se obtiene: i) 28 – 64 = 256(10 – 64(10 = 192(10 = 11000000(2, o bien, ii) 28 – 64 = 100000000(2 – 1000000(2 = 11000000(2, o bien, iii) +64(10 = +1000000(2 → Representación de la magnitud positiva → 01000000(2 → → Cambio de signo → 11000000(2 Decimal Binario Complemento a 2 Signo y magnitud +53(10 +110101(2 00110101(2 00110101(2 −25(10 −11001(2 11100111(2 10011001(2 +93(10 +1011101(2 01011101(2 01011101(2 −1(10 −1(2 11111111(2 10000001(2 −127(10 −1111111(2 10000001(2 11111111(2 −64(10 −1000000(2 11000000(2 11000000(2 24. Si consideramos que son valores en signo y magnitud, tenemos: 00110110(2 = +54(10 11011010(2 = −90(10 01110110(2 = +118(10 11111111(2 = −127(10 11100100(2 = −100(10 Si consideramos que son valores en complemento a 2: 00110110(2 = +54(10 11011010(2 = −27+ 90(10 = −38(10 01110110(2 = +118(10 11111111(2 = −27 + 127(10 = −1(10 11100100(2 = −27 + 100(10 = −28(10 27. Para hacer las operaciones de suma y resta en signo y magnitud, debemos tener en cuenta el signo de las magnitudes y actuar consecuentemente. Para más claridad, al lado de la ope- 102 © FUOC • PID_00153515 Representación de la información numérica ración en binario se ha hecho el equivalente en base 10. Los valores A, B y C en base 10 corresponden a: A = 1100100111(2 = −295(10 B = 1000011101(2 = −29(10 C = 0101011011(2 = +347(10 • Suma A + B A es negativo y B también. Por lo tanto, haremos la suma de las magnitudes (sin signo) y si no hay desbordamiento, añadiremos un 1 como bit de signo al resultado obtenido, para conseguir el resultado en la representación en signo y magnitud: Suma A + B + 1 1 1 1 1 1 ← transporte 1 1 ← transporte −2 9 5 (10 −2 9 (10 2 4 (10 1 0 0 1 0 0 1 1 1 (2 0 0 0 0 1 1 1 0 1 (2 1 0 1 0 0 0 1 0 0 (2 + −3 A + B = 1101000100(2 = −324(10 • Resta A − B A es negativo y B también. Por lo tanto, restaremos la magnitud pequeña (B) de la magnitud grande (A) y aplicaremos el signo de la magnitud grande (A) al resultado (no se puede producir desbordamiento): Resta A − B 1 − 0 0 1 0 0 1 1 1 1 1 ← transporte −2 (2 0 0 0 0 1 1 1 0 1 (2 1 0 0 0 0 1 0 1 0 (2 − −2 9 5 1 ← transporte +2 9 (10 6 6 (10 (10 A − B = 1100001010(2 = −266(10 • Suma A + C A es negativo y C es positivo. Por lo tanto, restaremos la magnitud pequeña (A) de la magnitud grande (C) y aplicaremos el signo de la magnitud grande (C) al resultado (no se puede producir desbordamiento): Suma A + C 1 0 1 0 1 1 − 1 0 1 1 1 ← transporte (2 1 0 0 1 0 0 1 1 1 (2 0 0 0 1 1 0 1 0 0 (2 A + C = 0000110100(2 = +52(10 + +3 4 1 ← transporte −2 9 5 (10 +0 5 2 (10 7 (10 103 © FUOC • PID_00153515 Representación de la información numérica • Resta A − C A es negativo y C es positivo. Por lo tanto, haremos la suma de las magnitudes (sin signo) y, si no hay desbordamiento, añadiremos un 1 como bit de signo al resultado obtenido, para conseguir el resultado en la representación en signo y magnitud: Resta A − C Desbordamiento ↓ 1 + 1 1 1 1 1 1 ← transporte 1 0 0 1 0 0 1 1 1 (2 1 0 1 0 1 1 0 1 1 (2 1 0 1 0 0 0 0 0 1 0 (2 + ← transporte 1 1 −2 9 5 (10 −3 4 7 (10 −6 4 2 (10 A − C = −642(10 No se puede representar con 10 bits en el formato de signo y magnitud. • Resta B − C B es negativo y C es positivo. Por lo tanto, haremos la suma de las magnitudes (sin signo) y, si no hay desbordamiento, añadiremos un 1 como bit de signo al resultado obtenido, para conseguir el resultado en la representación en signo y magnitud: Resta B − C 1 + 1 1 1 1 ← transporte 0 0 0 0 1 1 1 0 1 (2 1 0 1 0 1 1 0 1 1 (2 1 0 1 1 1 1 0 0 0 (2 + 1 ← transporte −2 9 (10 −3 4 7 (10 −3 7 6 (10 B − C = 1101111000(2 = –376(10 • Suma B + C B es negativo y C es positivo. Por lo tanto, restaremos la magnitud pequeña (B) de la magnitud grande (C) y aplicaremos el signo de la mayor magnitud (C) al resultado (no se puede producir desbordamiento): Suma B + C 1 0 1 0 1 1 0 1 1 1 − 1 1 1 ← transporte 0 0 0 0 1 1 1 0 1 (2 1 0 0 1 1 1 1 1 0 (2 B + C = 0100111110(2 = +318(10 +3 (2 − +3 4 7 1 ← transporte +2 9 (10 1 8 (10 (10 104 © FUOC • PID_00153515 Representación de la información numérica 26. Para hacer las operaciones de suma Ca2, operaremos directamente sobre las representaciones. El resultado será correcto siempre que no se produzca desbordamiento. Para hacer las operaciones de resta, aplicaremos un cambio de signo al sustraendo y haremos una operación de suma: A = 1100100111(2 = −217(10 B = 1000011101(2 = −483(10 C = 0101011011(2 = +347(10 • Suma A + B Suma A + B Desbordamiento ↓ 1 1 1 1 1 1 1 1 1 0 0 1 0 0 1 1 1 (2 1 0 0 0 0 1 1 1 0 1 (2 1 0 1 0 1 0 0 0 1 0 0 (2 + + 1 1 −2 1 7 (10 −4 8 3 (10 −7 0 0 (10 A + B = −700(10 Se produce desbordamiento, dado que al sumar dos números negativos obtenemos uno positivo. El resultado no cabe en el formato de salida. Recordemos que el rango de representación de enteros con 10 bits con el formato de complemento a 2 es [−210−1, 210−1 − 1] = [−512, 511]. • Resta A − B Aplicaremos un cambio de signo a B y haremos una operación de suma: 1000011101 ^ Se mantienen los bits hasta aquí (el primer 1 que encontramos, incluyendo éste) 1 ^ Se complementan los bits a partir de este punto 011110001 Al aplicar el cambio de signo al 1000011101, obtenemos el 0111100011, que será el valor que utilizaremos en la suma: Suma A + (−B) Transporte que se desprecia ↓ 1 + 1 1 1 1 1 1 1 ← transporte 1 1 0 0 1 0 0 1 1 1 (2 0 1 1 1 1 0 0 0 1 1 (2 1 0 1 0 0 0 0 1 0 1 0 (2 A − B = 0100001010 = +266(10 +4 8 3 1 + (10 ← transporte −2 1 7 (10 +2 6 6 (10 105 © FUOC • PID_00153515 Representación de la información numérica • Suma A + C A es negativo y C es positivo. No se puede producir desbordamiento: Suma A + C Transporte que se desprecia ↓ 1 1 1 1 1 1 1 1 1 ← transporte 1 1 0 0 1 0 0 1 1 1 (2 0 1 0 1 0 1 1 0 1 1 (2 1 0 0 1 0 0 0 0 0 1 0 (2 + +3 4 7 1 + (10 ← transporte −2 1 7 (10 +1 3 0 (10 A + C = 0010000010 = +130(10 • Resta A − C Aplicaremos un cambio de signo a C y haremos una operación de suma: + 0101011011 ← Valor numérico inicial 1010100100 ← Complemento bit a bit de la expresión inicial 1 ← 1010100101 Sumamos 1 al bit menos significativo del formato Al aplicar un cambio de signo al 0101011011, obtenemos el 1010100101, que será el valor que utilizaremos en la suma: Suma A + (−C) Desbordamiento ↓ 1 1 1 1 1 ← transporte 1 1 0 0 1 0 0 1 1 1 (2 1 0 1 0 1 0 0 1 0 1 (2 1 0 1 1 1 0 0 1 1 0 0 (2 + 1 + ← transporte −2 1 7 (10 −3 4 7 (10 −5 6 4 (10 A − C = −564(10 Se produce desbordamiento, puesto que al sumar dos números negativos obtenemos uno positivo. El resultado no cabe en el formato de salida. Recordemos que el rango de representación de enteros con 10 bits con el formato de complemento a 2 es [−210−1, 210−1 − 1] = [−512, 511]. • Resta B − C Aplicaremos un cambio de signo a C y haremos una operación de suma. Al aplicar un cambio de signo al 0101011011 obtenemos el 1010100101, que será el valor que utilizaremos en la suma: Suma B + (−C) Desbordamiento ↓ 1 + 1 1 1 1 1 ← transporte 1 0 0 0 0 1 1 1 0 1 (2 1 0 1 0 1 0 0 1 0 1 (2 1 0 0 1 1 0 0 0 0 1 0 (2 B − C = −830(10 + ← transporte 1 1 −4 8 3 (10 −3 4 7 (10 −8 3 0 (10 106 © FUOC • PID_00153515 Representación de la información numérica Se produce desbordamiento, dado que al sumar dos números negativos, obtenemos uno positivo. El resultado no cabe en el formato de salida. • Suma B + C B es negativo y C es positivo. No se puede producir desbordamiento: Suma B + C 1 + 1 1 1 1 ← transporte 1 0 0 0 0 1 1 1 0 1 (2 0 1 0 1 0 1 1 0 1 1 (2 1 1 0 1 1 1 1 0 0 0 (2 1 + 1 ← transporte −4 8 3 (10 +3 4 7 (10 −1 3 6 (10 B + C = 1101111000 = −136(10 27. a) Si la cadena de bits 10110101 representa un número en Ca2 se trata de un número negativo, ya que el primer bit es 1. Podemos hacer un cambio de signo para obtener la magnitud positiva: 1 0 1 1 0 1 0 1 ← Valor numérico inicial 0 1 0 0 1 0 1 0 ← Complemento bit a bit de la expresión inicial 1 ← Sumamos 1 al bit menos significativo del formato + 0 1 0 0 1 0 1 1 Para codificar el valor inicial en signo y magnitud, únicamente debemos cambiar el bit de signo del valor conseguido con el cambio de signo. Por lo tanto, la codificación en signo y magnitud del valor 10110101 que está en Ca2 es 11001011(2. La codificación en 16 bits se puede obtener por extensión del formato, que en este caso se consigue si añadimos unos necesarios a la izquierda del MSB: 11001011(2 = 1111111111001011(2 b) Si se trata de un número codificado en signo y magnitud, es un número negativo, ya que el primer dígito corresponde al signo y es 1. El resto de los dígitos codifican la magnitud en binario. Podemos obtener la magnitud positiva si cambiamos el bit de signo: 00110101(2. La representación de los valores positivos coincide en Ca2 y en signo y magnitud. Por lo tanto, a partir de la magnitud positiva en Ca2 podemos conseguir la magnitud negativa en si aplicamos un cambio de signo: 0 0 1 1 0 1 0 1 ← Valor numérico inicial 1 1 0 0 1 0 1 0 ← Complemento bit a bit de la expresión inicial 1 ← Sumamos 1 al bit menos significativo del formato + 1 1 0 0 1 0 1 1 Por lo tanto, la codificación en Ca2 del valor 10110101(2 que está en signo y magnitud es 11001011(2. 107 © FUOC • PID_00153515 La codificación en 16 bits se puede obtener por extensión del formato, que en este caso se consigue copiando el bit de más peso a la izquierda de la codificación tantas veces como sea necesario: 11001011(2 = 1111111111001011(2 28. Para poder representar el intervalo [−25,50] en una representación en exceso será necesario elegir un desplazamiento que transforme este intervalo en un intervalo de números naturales. La transformación del intervalo que se obtiene al sumar M es [−25 + M, 50 + M]. Para que este intervalo sea un intervalo de los naturales, es necesario que −25 + M ≥ 0 y, por lo tanto, el valor del exceso que permite representar este intervalo es M = 25. 29. a) Los números 3(10 y −8(10 se codifican en exceso a 7 y decimal de la manera siguiente: 3(10 + 7(10 = 10(10 · 3(10 codificado en exceso a 7(10 es 10(10. −8(10 + 7(10 = −1(10 · −8(10 codificado en exceso a 7(10 es −1(10. b) El número −4(10 se codifica en 6 bits y exceso a 7 de la manera siguiente: −4(10 + 7(10 = 3(10. −4 codificado en exceso a 7 es 3(10 y codificado en base 2 es 000011(2. c) Los números 3(10 y −6(10 se codifican en exceso a 4 de 8 bits: 3(10 + 4(10 = 7(10. 3 codificado en exceso a 4 es 7(10 y codificado en base 2 es 00000111(2. −6(10 + 4(10 = −2(10. El resultado de la codificación es un número negativo. Por lo tanto, el número −6 no se puede codificar en exceso a 4. 30. Si aplicamos el TFN, obtenemos que 000000(2 = 0(10. Por lo tanto, el número que codifica es 0(10 − 31(10 = −31(10. Si aplicamos el TFN, obtenemos que 100000(2 = 32(10. Por lo tanto, el número que codifica es 32(10 − 31(10 = 1(10. Si aplicamos el TFN, obtenemos que 111111(2 = 63(10. Por lo tanto, el número que codifica es 63(10 − 31(10 = 32(10. 31. Sabemos que 25(10 = 100000(2. Este número marcará el 0 en la representación en exceso. Es decir, los números menores que éste representarán negativos y los mayores serán positivos (hay que darse cuenta de que los números menores, es decir, los negativos, empezarán con 0, mientras que los mayores, es decir, los positivos, empezarán con 1). El número 011100(2 es negativo. El número 100111(2 es positivo. El número 000000(2 es negativo. 32. ← transporte 1 + − 0 0 0 1 0 0 (2 1 0 0 1 0 0 (2 1 0 1 0 0 0 (2 1 0 1 0 0 0 (2 1 0 0 0 0 0 (2 0 0 1 0 0 0 (2 se suman los 2 números restamos el exceso La suma de estos números en exceso a 25 es 000100(2 + 100100(2 = 001000(2 que es el −24(10 en exceso a 100000(2 ( = 32(10). Representación de la información numérica 108 © FUOC • PID_00153515 33. 0 0 0 1 0 0 − (2 ← transporte 1 ← los dos números se restan 1 0 0 1 0 0 (2 1 1 0 0 0 0 0 (2 1 ← transporte 1 1 0 0 0 0 0 (2 1 0 0 0 0 0 (2 1 0 0 0 0 0 0 0 (2 1 + ← sumamos el exceso El resto de estos números en exceso a 25 es 000100(2 − 100100(2 = 000000(2 que es el –32(10 en exceso a 100000(2 ( = 32(10). 34. a) Exceso a 10000(2 + − Decimal 1 1 0 0 0 (2 (+8(10) 0 0 0 0 0 (2 (−32(10) 1 1 0 0 0 (2 1 1 0 0 0 (2 1 0 0 0 0 (2 0 1 0 0 0 (2 (−24(10) La suma de estos números en exceso a 25 es 11000(2 + 00000(2 = 01000(2 = −24(10 b) Exceso a 10000(2 + Decimal 0 0 0 0 0 (2 (−32(10) 0 0 0 0 0 (2 (−32(10) 0 0 0 0 0 (2 0 0 0 0 0 (2 ← transporte 1 − 1 0 0 0 0 (2 1 1 0 0 0 0 (2 (0(10) Podemos observar que el resultado de la suma no es correcto, ya que los dos números iniciales son negativos, mientras que el resultado es positivo. Además, podemos detectar que el resultado es incorrecto porque hay desbordamiento en la última operación. Representación de la información numérica 109 © FUOC • PID_00153515 c) Exceso a 10000(2 Decimal ← transporte 1 0 1 0 0 0 (2 (−8(10) 1 1 1 1 1 (2 (+15(10) 1 0 0 1 1 1 (2 1 0 0 1 1 1 (2 + ← transporte 1 − 1 0 0 0 0 (2 0 1 0 1 1 1 (2 (+7(10) La suma de estos números en exceso a 25 es 01000(2 + 11111(2 = 010111(2 = 7(10. 35. a) Con este formato, el número binario que representa esta tira de bits es 101,0010(2, y al aplicar el TFN, se obtiene el número decimal que representa: 101,0010(2 = 1 · 22 + 0 · 21 + 1 · 20 + 0 · 2–1 + 0 · 2–2 + 1 · 2–3 + 0 · 2–4 = = 22 + 20 + 2–3 = = 4 + 1 + 0,125 = = 5,125(10 = b) En este caso, el número binario que representa esta tira de bits es 101001,0(2 , y al aplicar el TFN, se obtiene el número decimal que representa: 101001,0(2 = 1 · 25 + 0 · 24 + 1 · 23 + 0 · 22 + 0 · 21 + 1 · 20 + 0 · 2–1 = = 25 + 23 + 20 = = 32 + 8 + 1 = = 41(10 = 36. Codificamos el número +12,85(10 en el formato especificado. Puesto que se trata de un número positivo, el bit de signo es 0. En lo que respecta a la magnitud 12,85(10, primero pasamos a binario la parte entera y, posteriormente, la parte fraccionaria. Para la parte entera, utilizamos el algoritmo de divisiones sucesivas por la base de llegada (2): 12 6 3 1 = = = = 6·2 3·2 1·2 0·2 + + + + 0 0 1 1 Así pues, 12(10 = 1100(2. En lo que respecta a la parte fraccionaria, hacemos multiplicaciones sucesivas por la base de llegada (2): 0,85 0,70 0,40 0,80 0,60 · · · · · 2 2 2 2 2 = = = = = 1,70 1,40 0,80 1,60 1,20 = = = = = 1 + 0,70 1 + 0,40 0 + 0,80 1 + 0,60 1 + 0,20 Puesto que el formato especificado sólo tiene 3 bits para la parte fraccionaria, ya tenemos más bits de los necesarios y podemos detener el proceso aquí. Por lo tanto, 0,85(10 = 0,11011…(2. Para aproximar el valor con 3 bits y redondeo, procedemos como sigue: 0,11011(2 + 0,0001(2 = 0,11101(2 → truncamos 3 bits → 0,111(2 A continuación, juntamos la parte entera y la fraccionaria y obtenemos: 12,85(10 = 1100,111(2. Finalmente, para obtener la representación en el formato indicado, hay que añadir el bit de signo, de manera que la tira de bits que representa este número en el formato dado es: 01100,111(2. Hay que recordar que la tira de bits que se almacenaría en un computador no contiene la coma ni la especificación de la base: 01100111. En los otros dos casos, procedemos de manera totalmente análoga. +0,7578125(10: • El bit de signo es 0, porque el número es positivo. Representación de la información numérica 110 © FUOC • PID_00153515 • La parte entera es 0(10 = 0(2. Puesto que tenemos 4 bits para la parte entera, escribiremos 0000(2. • En lo que respecta a la parte fraccionaria: 0,7578125 0,515625 0,03125 0,0625 0,1250 · · · · · 2 2 2 2 2 = = = = = 1,515625 1,03125 0,0625 0,125 0,25 = = = = = 1 + 0,515625 1 + 0,03125 0 + 0,0625 0 + 0,125 0 + 0,25 De este modo, 0,7578125(10 = 0,11011…(2 que, si redondeamos con 3 bits: 0,11000(2 + 0,0001(2 = 0,11010(2 → truncamos 3 bits → 0,110(2 Finalmente, se juntan todas las partes y obtenemos 0,7578125(10 = 00000,110(2. Por lo tanto, la tira de bits que se almacenaría en un computador es 00000110. −11,025(10: • El bit de signo es 1, porque el número es negativo. • La parte entera es 11(10: 11 5 2 1 = = = = 5·2 2·2 1·2 0·2 + + + + 1 1 0 1 Es decir, 11(10 = 1011(2. En lo que respecta a la parte fraccionaria: 0,025 0,05 0,1 0,2 0,4 · · · · · 2 2 2 2 2 = = = = = 0,05 0,1 0,2 0,4 0,8 = = = = = 0 + 0,05 0 + 0,1 0 + 0,2 0 + 0,4 0 + 0,8 De este modo, 0,025 (10 = 0,00000… (2 que, si redondeamos con 3 bits: 0,00000 (2 + 0,0001(2 = 0,00010(2 → truncamos 3 bits → 0,000(2 Finalmente, se juntan todas las partes y obtenemos –11,025(10 = 11011,000(2. Por lo tanto, la tira de bits que se almacenaría en un computador es 11011000. 37. Para obtener la representación decimal de estas cadenas de bits, sólo hay que aplicar el TFN considerando que los tres últimos bits constituyen la parte fraccionaria y que el primer bit representa el signo: 01001111→ +1001,111(2 +1001,111(2 = = = = 1 · 23 + 0 · 22 + 0 · 21 + 1 · 20 + 1 · 2–1 + 1 · 2–2 + 1 · 2–3 = 23 + 20 + 2–1 + 2–2 + 2–3 = 8 + 1 + 0,5 + 0,25 + 0,125 = +9,875(10 11001111 → –1001,111(2 –1001,111(2 = –(1 · 23 + 0 · 22 + 0 · 21 + 1 · 20 + 1 · 2–1 + 1 · 2–2 + 1 · 2–3) = = –(23 + 20 + 2–1 + 2–2 + 2–3 ) = –(8 + 1 + 0,5 + 0,25 + 0,125) = = –9,875(10 01010100 → +1010,100(2 +1010,100(2 = 1 · 23 + 0 · 22 + 1 · 21 + 0 · 20 + 1 · 2–1 + 0 · 2–2 + 0 · 2–3 = 23 + 21 + 2–1 = = 8 + 2 + 0,5 = +10,5(10 00000000 → +0000,000(2 +0000,000(2 = 0 · 23 + 0 · 22 + 0 · 21 + 0 · 20 + 0 · 2–1 + 0 · 2–2 + 0 · 2–3 = = +0(10 10000000 → –0000,000(2 –0000,000(2 = – (0 · 23 + 0 · 22 + 0 · 21 + 0 · 20 + 0 · 2–1 + 0 · 2–2 + 0 · 2–3) = = –0(10 Representación de la información numérica 111 © FUOC • PID_00153515 38. Para extender el rango de estas tiras de bits, hay que añadir ceros tanto a la izquierda como a la derecha de la magnitud, dado que se trata de magnitudes sin signo. La representación original tiene 5 bits para la parte entera y la representación de llegada tiene 8. Por lo tanto, hay que añadir 8 – 5 = 3 bits a la izquierda de la magnitud. De la misma manera, la representación original tiene 3 bits para la parte fraccionaria, mientras que la representación de llegada tiene 4. Así pues, añadir 4 – 3 = 1 bit a la derecha de la magnitud: 00101010 → 00101,010 → 00000101,0100 → 000001010100 11010010 → 11010,010 → 00011010,0100 → 000110100100 10100010 → 10100,010 → 00010100,0100 → 000101000100 39. En este caso, hay que considerar que el primer bit representa el signo. La extensión de la parte entera implica insertándole tantos ceros como sea necesario. En este caso, pasamos de 4 a 7 bits para la parte entera; por lo tanto, habrá que añadir 7 – 4 = 3 bits a la izquierda de la parte entera. En lo que respecta a la parte fraccionaria, la situación es idéntica en el ejercicio anterior. Así pues, habrá que añadir 4 – 3 = 1 bit a la derecha de la magnitud: 00101010 → 0101,010 → 0000101,0100 → 000001010100 11010010 → 1010,010 → 0001010,0100 → 100010100100 10100010 → 0100,010 → 0000100,0100 → 100001000100 40. a) El rango de una representación fraccionaria con signo y magnitud es: [–2n–m–1 + 2–m, +2n–m–1 – 2–m] donde n es el número de bits utilizado en la representación y m el número de dígitos fraccionarios. Por lo tanto, el rango en este caso se obtiene haciendo n = 8 y m = 3, es decir: [–28–3–1 + 2–3, +28–3–1 – 2–3] = [–24 + 2–3, +24 – 2–3] = [–15,875(10, +15,875(10] En lo que respecta a la precisión, es determinada por el bit de menos peso de la magnitud, concretamente 2–m = 2–3 = 0,125(10. b) En este caso la situación es la misma que en el apartado anterior, pero con n = 8 y m = 4. El rango es el siguiente: [–28–4–1 + 2–4, +28–4–1 – 2–4] = [–23 + 2–4, +23 – 2–4] = [–7,9375(10, +7,9375(10] De manera análoga, la precisión es 2–m = 2–4 = 0,0625(10. c) En coma fija sin signo, el rango de representación es determinado por: [0, +2n–m – 2–m] donde n es el número de bits utilizado en la representación, y m el número de dígitos fraccionarios. Por lo tanto, el rango en este caso se obtiene haciendo n = 8 y m = 3, es decir: [0, +28–3 – 2–3] = [0, +25 – 2–3] = [0, +31,875(10]. La precisión es la misma que en los casos anteriores, porque es independiente de si la representación es sin signo o en signo y magnitud. Por lo tanto, la precisión es 2–m = 2–3 = 0,125. d) En este caso, la situación es la misma que en el apartado anterior, pero con n = 8 y m = 4. El rango es el siguiente: [0, +28–4 – 2–4] = [0, +24 – 2–4] = [0, +15,9375(10]. De manera análoga, la precisión es 2–m = 2–4 = 0,0625(10. 41. Para determinar la precisión necesaria para representar el número +0,1875(10 de una manera exacta, primero codificaremos este número en binario; haremos multiplicaciones sucesivas por la base de llegada: 0,1875 0,375 0,75 0,5 · · · · 2 2 2 2 = = = = 0,375 0,75 1,5 1 = = = = 0 + 0,375 0 + 0,75 1 + 0,5 1+0 Entonces, 0,1875(10 = 0,0011(2. Así pues, para poder representar este número de una manera exacta es necesario que la representación disponga, como mínimo, de cuatro dígitos fraccionarios (m = 4), es decir, una precisión de la forma 2–m = 2-4 = 0,0625(10. Representación de la información numérica 112 © FUOC • PID_00153515 42. En primer lugar, obtendremos la codificación en signo y magnitud de estos dos números: a) +31,875(10: • El bit de signo es 0, porque el número es positivo. • La parte entera es 31(10: 31 15 7 3 1 = = = = = 15 · 2 7·2 3·2 1·2 0·2 + + + + + 1 1 1 1 1 Es decir: 31(10 = 11111(2. • En lo que respecta a la parte fraccionaria: 0,875 0,75 0,5 · · · 2 2 2 = 1,75 = 1,5 = 1 1 + 0,75 1 + 0,5 1+0 = = = Así pues: 0,875 (10 = 0,111(2 • Finalmente, se juntan todas las partes y obtenemos +31,875(10 → 011111,111(2. b) –16,21875(10 • El bit de signo es 1, porque el número es positivo. • La parte entera es 16(10: 16 8 4 2 1 = = = = = 8·2 4·2 2·2 1·2 0·2 + + + + + 0 0 0 0 1 Es decir, 16(10 = 10000(2. • En lo que respecta a la parte fraccionaria: 0,21875 0,4375 0,875 0,75 0,5 · · · · · 2 2 2 2 2 = = = = = 0,4375 0,875 1,75 1,5 1 = = = = = 0 + 0,4375 0 + 0,875 1 + 0,75 1 + 0,5 1+0 Así pues: 0,21875 (10 = 0,00111(2 • Finalmente, se juntan todas las partes y obtenemos –16,21875(10 = 110000,00111. Para representar exactamente los dos números, es necesario un formato que tenga: • Un bit de signo. • 5 bits para la parte entera (con 5 bits se pueden representar exactamente tanto 16(10 como 31(10). • 5 bits para la parte fraccionaria (con 5 bits se pueden representar exactamente tanto 0,875(10 como 0,21875(10). Tenemos, por lo tanto, un formato de signo y magnitud con n = 11 (bit de signo, 5 bits de parte entera y 5 bits de parte fraccionaria) y m = 5. Con estos datos, el rango es el siguiente: [–2n–m–1 + 2–m, +2n–m–1 – 2–m] = [–211–5–1 + 2–5, +211–5–1 – 2–5] = = [–25 + 2–5, +25 – 2–5] = [–31,96875(10, +31,96875(10] La precisión es 2–m = 2–5 = 0,03125(10. 43. a) 00111000(2 → +0111,000(2 = 1 · 22 + 1 · 21 + 1 · 20 = 4 + 2 + 1 = +7(10 10100000(2 → –0100,000(2 = –1 · 22 = –4(10 Para calcular la suma de estos dos números es necesario, primero, darse cuenta de que se trata de números de diferente signo. Por lo tanto, la suma se obtendrá restando la mayor magnitud (0111,000(2) de la menor (0100,000(2) y copiando el signo de la mayor magnitud (positivo): 0 1 1 1 0 0 , 0 0 0 0 0 0 (2 ← transportes − 0 1 0 0 , 0 0 0 (2 0 0 1 1 , 0 0 0 (2 ← resultado Representación de la información numérica 113 © FUOC • PID_00153515 Por lo tanto: 00111000(2 + 10100000(2 +0111,000(2 + (–0100,000(2) = +0011,000(2 → 00011000(2. Si convertimos el resultado a base 10: +0011,000(2 = 1 · 21 + 1 · 20 = 2 + 1 = 3(10 Que demuestra que el resultado es correcto, ya que +7(10 + (–4(10) = 3(10. Para calcular la resta será necesario hacer la suma de las magnitudes, porque el número 10100000(2 es negativo. El resultado de la resta será positivo (porque a un número positivo le restamos uno negativo): 1 0 0 0 + 0 ← transportes 0 0 1 1 1 , 0 0 0 (2 0 1 0 0 , 0 0 0 (2 1 0 1 1 , 0 0 0 (2 ← resultado Por lo tanto: 00111000(2 – 10100000(2 → +0111,000(2 – (–0100,000(2) = +1011,000(2 = 01011000(2 De nuevo, podemos comprobar que el resultado obtenido es correcto si lo convertimos a base 10: +1011,000(2 = 23 + 21 + 20 = 8 + 2 + 1 = +11(10 = +7(10 – (–4(10) b) 10111010(2 → –0111,010(2 = –(22 + 21 + 20 + 2–2) = –(4 + 2 + 1 + 0,25) = –7,25(10 11101100(2 → –1101,100(2 = – (23 + 22 + 20 + 2–1) = –(8 + 4 + 1 + 0,5) = –13,5(10 En este caso se trata de dos números negativos, dado que el primer dígito, que indica el signo, es un 1 en los dos casos. Para hacer la suma, se deberá sumar las magnitudes y copiar el bit signo: 1 + 1 1 1 0 0 0 ← transportes 0 1 1 1 , 0 1 0 (2 1 1 0 1 , 1 0 0 (2 0 1 0 0 , 1 1 0 (2 ← resultado Observad que se ha producido transporte en el último bit y, por lo tanto, puesto que estamos sumando sólo las magnitudes, hay desbordamiento. Esto quiere decir que el resultado de la suma no es representable con 8 bits de los cuales 3 son fraccionarios. Si dispusiéramos de un bit más para la parte entera (un formato de 9 bits con 3 fraccionarios), el resultado sí que sería representable: –10100,110(2 → 110100110. Efectivamente, comprobamos que: –10100,110(2 = –(24 + 22 + 2–1 + 2–2) = –(16 + 4 + 0,5 + 0,25) = –20,75(10 = –7,25(10 + (–13,5(10). En lo que respecta al resto, hay que darse cuenta de que el sustraendo (–1101,100(2) es mayor en magnitud que el minuendo (–0111,010(2). Así pues, haremos la resta de las magnitudes como 1101,100(2 – 0111,010(2 y el resultado debe ser positivo: 1 1 0 1 1 − 1 0 , 0 1 0 1 0 0 (2 ← transportes 0 1 1 1 , 0 1 0 (2 0 1 1 0 , 0 1 0 (2 ← Resultado Representación de la información numérica 114 © FUOC • PID_00153515 Por lo tanto: 10111,010(2 = – 11101100(2 = –0111,010(2 – (–1101100(2) = +0110,010(2 → 0110010(2. De nuevo, podemos comprobar que el resultado obtenido es correcto si lo convertimos a base 10: +0110,010(2 = 22 + 21 + 2–2 = 4 + 2 + 0,25 = +6,25(10 = –7,25(10 – (–13,5(10) = –7,25(10 + 13,5(10. 44. a) En primer lugar, hay que identificar los diferentes elementos que componen este formato: Signo (S) Exponente (e) Mantisa 1 111 0010 • Bit de signo S = 1. Por lo tanto, se trata de un número negativo. • Exponente. Puesto que la mantisa es de 4 bits, quedan 3 bits (111(2) para el exponente (q = 3). Por lo tanto, el exceso será M = 2q–1 = 22 = 4(10. Entonces, el exponente vale: e = 111(2 – 4(10 = = (22 + 21 + 20) – 4 = (4 + 2 + 1) – 4 = 7 – 4 = 3(10. • Finalmente, los cuatro bits que quedan forman la mantisa que, puesto que está normalizada en la forma 1,X con bit implícito, toma el valor R = 1,0010(2. Ahora ya podemos calcular el número representado en base 10 aplicando la fórmula ±R · 2e y el TFN: –1,0010(2 · 23 = –(20 + 2–3) · 23 = –(23 + 20) = –(8 + 1) = –9(10. b) En este caso, procedemos de manera totalmente análoga a la del apartado anterior: Signo (S) Exponente (e) Mantisa 0 1010 011 • Bit de signo s = 0. Por lo tanto, se trata de un número positivo. • Exponente. Dado que la mantisa es de 3 bits, quedan 4 bits (1010(2) para el exponente (q = 4). Por lo tanto, el exceso será M = 2q–1 = 23 = 8(10. Entonces, el exponente vale e = 1010(2 – 8(10 = = (23 + 21) – 8 = (8 + 2) – 8 = 10 – 8 = 2(10. • Finalmente, los cuatro bits que quedan forman la mantisa que, puesto que está normalizada en la forma 1,X con bit implícito, toma el valor R = 1,011(2. Ahora ya podemos calcular el número representado en base 10 aplicando la fórmula ±R · 2e y el TFN: +1,011(2 · 22 = +(20 + 2–2 + 2–3) · 22 = +(22 + 20 + 2–1) = +(4 + 1 + 0,5) = +5,5(10. 45. a) El formato especificado tiene la forma dada por la siguiente tabla: Signo (S) Exponente (e) Mantisa 1 bit 4 bits 3 bits En primer lugar, codificaremos la magnitud 1,335(10 en base 2: • La parte entera es 1(10: 1 = 0·2 + 1 Es decir, 1(10 = 1(2. • En lo que respecta a la parte fraccionaria: 0,335 0,67 0,34 0,68 0,36 0,72 · · · · · · 2 2 2 2 2 2 = = = = = = 0,67 1,34 0,68 1,36 0,72 1,44 = = = = = = 0 + 0,67 1 + 0,34 0 + 0,68 1 + 0,36 0 + 0,72 1 + 0,44 Representación de la información numérica 115 © FUOC • PID_00153515 Así pues, 0,355(10 = 0,010101…(2 y nos detenemos, porque ya tenemos bastantes más bits de los que permite representar este formato. • Ahora, se juntan las dos partes de la magnitud y obtenemos 1,335(10 = 1,010101(2. • A continuación, normalizamos la expresión obtenida (añadiendo la información del signo) en la forma ±R · 2e: +1,335(10 = +1,010101(2 · 20. • Finalmente, obtenemos los diferentes elementos que definen la representación. – Signo: se trata de un número negativo. Por lo tanto, el bit de signo será un 1. – Exponente: el exponente es 0(10, que hay que codificar en exceso a M = 2q–1. Puesto que disponemos de 4 bits, el exceso es M = 23 = 8. Por lo tanto, hay que representar 0(10 + 8(10 = 8(10 con 4 bits: 8 4 2 1 = = = = 4·2 2·2 1·2 0·2 + + + + 0 0 0 1 Es decir, e = 8(10 = 1000(2 (en exceso a 8). – Mantisa: R = 1,010101(2. Puesto que hay bit implícito (1,X), sólo es necesario representar la parte derecha de la coma y disponemos de 3 bits (con truncamiento). Así pues, la mantisa serán los tres bits a partir de la coma: 010. – Ahora ya podemos juntar todas las partes: Signo (S) Exponente (e) Mantisa 1 1000 010 Es decir, la representación es 11000010. b) La única diferencia con el apartado anterior es el cálculo de la mantisa, porque ahora hay que redondear en lugar de truncar. Tal y como se indica más arriba, tenemos R = 1,010101(2. Para redondearlo con tres bits, hay que sumarle la mitad de la precisión y truncar su resultado: 1,010101(2 + 0,0001(2 = 1,011001(2 → truncamos 3 bits → 1,011(2 Por lo tanto, la representación será la siguiente: Signo (s) Exponente (e) Mantisa 1 1000 011 Es decir, la secuencia bits de la representación es 11000011. c) El formato especificado tiene la forma dada por la siguiente tabla: Signo (S) Exponente (e) Mantisa 1 bit 5 bits 3 bits En primer lugar, codificaremos la magnitud 10,0327(10 en base 2: • La parte entera es 10(10: 10 5 2 1 = = = = 5·2 2·2 1·2 0·2 + + + + 0 1 0 1 Es decir, 10(10 = 1010(2. • En lo que respecta a la parte fraccionaria: 0,0327 0,0654 0,1308 0,2616 0,5232 0,0464 · · · · · · 2 2 2 2 2 2 = = = = = = 0,0654 0,1308 0,2616 0,5232 1,0464 0,0928 = = = = = = 0 + 0,0654 0 + 0,1308 0 + 0,2616 0 + 0,5232 1 + 0,0464 0 + 0,0928 Representación de la información numérica 116 © FUOC • PID_00153515 Así pues, 0,0327(10 = 0,000010...(2 y nos detenemos, porque ya tenemos bastantes más bits de los que permite representar este formato. • Ahora, se juntan las dos partes de la magnitud y obtenemos 10,0327(10 = 1010,000010(2. • A continuación, normalizamos la expresión obtenida (añadiendo la información del signo) en la forma ±R · 2e: +10,0327(10 = +1,010000010(2 · 23. • Finalmente, obtenemos los diferentes elementos que definen la representación: – Signo: se trata de un número positivo. De esta manera, el bit de signo será un 0. – Exponente: el exponente es 3(10, que hay que codificar en exceso a M = 2q–1. Puesto que disponemos de 5 bits, el exceso es M = 24 = 16. Por lo tanto, hay que representar 3(10 + 16(10 = 19(10 con 4 bits: 19 9 4 2 1 = = = = = 9·2 4·2 2·2 1·2 0·2 + + + + + 1 1 0 0 1 Es decir, e = 19(10 = 10011(2 (en exceso a 16). – – Mantisa: R = 1,010000010(2. Puesto que hay bit implícito (1,X), sólo es necesario representar la parte derecha de la coma y disponemos de 3 bits (con truncamiento). De este modo, la mantisa serán los tres bits a partir de la coma: 010. Ahora ya podemos juntar todas las partes: Signo (S) Exponente (e) Mantisa 0 10011 010 Es decir, la representación es 010011010. d) De nuevo, la única diferencia con el apartado anterior es el cálculo de la mantisa, porque ahora hay que redondear en lugar de truncar. Tal y como se indica más arriba, tenemos R = 1,010000010(2. Para redondearlo con tres bits, hay que sumarle la mitad de la precisión y truncar su resultado: 1,010000010(2 + 0,0001(2 = 1,010100010(2 truncamos 3 bits 1,010(2 Por lo tanto, la representación será la siguiente: Signo (S) Exponente (e) Mantisa 0 10011 010 Es decir, se obtiene la misma secuencia de bits que en el caso de truncamiento: 010011010. e) El formato especificado tiene la forma dada por la siguiente tabla: Signo (S) Exponente (e) Mantisa 1 bit 3 bits 4 bits • En primer lugar, codificaremos la magnitud 2 · 103(10 = 2000(10 en base 2: 2000 1000 500 250 125 62 31 15 7 3 1 = = = = = = = = = = = 1000 500 250 125 62 31 15 7 3 1 0 · · · · · · · · · · · 2 2 2 2 2 2 2 2 2 2 2 + + + + + + + + + + + 0 0 0 0 1 0 1 1 1 1 1 Es decir, 2000(10 = 11111010000(2. • A continuación, normalizamos la expresión obtenida (añadiendo la información del signo) en la forma ±R · 2e: –2000(10 = –1,1111010000(2 · 210. Representación de la información numérica 117 © FUOC • PID_00153515 • Finalmente, obtenemos los diferentes elementos que definen la representación. – Signo: se trata de un número negativo. Por lo tanto, el bit de signo será un 1. – Exponente: el exponente es 10(10 que hay que codificar en exceso a M = 2q–1. Puesto que disponemos de 3 bits, el exceso es M = 22 = 4. Por lo tanto, hay que representar 10(10 + 4(10 = 14(10 con 3 bits. Ahora bien, el rango de representación de números naturales con 3 bits es [0, 23 – 1] = [0(10, 7(10] . Por lo tanto, el exponente obtenido (14(10) no se puede representar en el formato dado. Se produce desbordamiento en el exponente. f) El formato especificado tiene la forma dada por la tabla siguiente: Signo (S) Exponente (e) Mantisa 1 bit 4 bits 3 bits En primer lugar, codificaremos la magnitud 10 · 103(10 = 10000(10 en base 2: 10000 5000 2500 1250 625 312 156 78 39 19 9 4 2 1 = = = = = = = = = = = = = = 5000 2500 1250 625 312 156 78 39 19 9 4 2 1 0 · · · · · · · · · · · · · · 2 2 2 2 2 2 2 2 2 2 2 2 2 2 + + + + + + + + + + + + + + 0 0 0 0 1 0 0 0 1 1 1 0 0 1 Es decir, 10000(10 = 10011100010000(2. • A continuación, normalizamos la expresión obtenida (añadiendo la información del signo) en la forma ±R · 2e: +10000(10 = +1,00111000100002 · 213. • Finalmente, obtenemos los diferentes elementos que definen la representación. – Signo: se trata de un número positivo; por lo tanto, el bit de signo será un 0. – Exponente: el exponente es 13(10, que hay que codificar en exceso a M = 2q–1. Puesto que disponemos de 4 bits, el exceso es M = 23 = 8. Por lo tanto, hay que representar 13(10 + 8(10 = 21(10 con 4 bits. Ahora bien, el rango de representación de números naturales con 4 bits es [0, 24 – 1] = [0(10, 15(10]. Por lo tanto, el exponente obtenido (21(10) no se puede representar en el formato dado. Se produce desbordamiento en el exponente. g) El formato especificado tiene la forma dada por la siguiente tabla: Signo (S) Exponente (e) Mantisa 1 bit 3 bits 4 bits En primer lugar, codificaremos la magnitud 2 · 10−6(10 = 0,000002(10 en base 2: 0,000002 0,000004 0,000008 0,000016 0,000032 0,000064 0,000128 0,000256 0,000512 0,001024 0,002048 0,004096 0,008192 0,016384 0,032768 0,065536 0,131072 0,262144 0,524288 0,048576 0,097152 0,194304 0,388608 · · · · · · · · · · · · · · · · · · · · · · · 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 = = = = = = = = = = = = = = = = = = = = = = = 0,000004 0,000008 0,000016 0,000032 0,000064 0,000128 0,000256 0,000512 0,001024 0,002048 0,004096 0,008192 0,016384 0,032768 0,065536 0,131072 0,262144 0,524288 1,048576 0,097152 0,194304 0,388608 0,777216 = = = = = = = = = = = = = = = = = = = = = = = Es decir, 0,000002(10 = 0,0000000000000000001000…(2. 0 + 0,000004 0 + 0,000008 0 + 0,000016 0 + 0,000032 0 + 0,000064 0 + 0,000128 0 + 0,000256 0 + 0,000512 0 + 0,001024 0 + 0,002048 0 + 0,004096 0 + 0,008192 0 + 0,016384 0 + 0,032768 0 + 0,065536 0 + 0,131072 0 + 0,262144 0 + 0,524288 1 + 0,048576 0 + 0,097152 0 + 0,194304 0 + 0,388608 0 + 0,777216 Representación de la información numérica 118 © FUOC • PID_00153515 • A continuación, normalizamos la expresión obtenida (añadiendo la información del signo) en la forma ±R · 2e: +0,000002(10 = +1,00002 · 2–19 . • Finalmente, obtenemos los diferentes elementos que definen la representación. – Signo: se trata de un número positivo, por lo tanto, el bit de signo será un 0. – Exponente: el exponente es –19(10, que hay que codificar en exceso a M = 2q–1. Dado que disponemos de 3 bits, el exceso es M = 22 = 4. Por lo tanto, se debe representar –19(10 + 4(10 = –15(10 con 3 bits. Ahora bien, el rango de representación de números naturales con 3 bits es [0, 23 – 1] = [0(10, 7(10] . Así pues, el exponente obtenido (–19(10) no se puede representar en el formato dado. Se produce desbordamiento a cero del exponente. Hay que tener presente que, en la práctica, muchos formatos de coma flotante (como por ejemplo el estándar IEEE754) introducen codificaciones reservadas para el número 0. En este caso, cuando se produce desbordamiento a cero del exponente, se acostumbra a aproximar el valor que se quiere representar para la codificación reservada al 0. También se puede elegir la representación del menor número positivo o del mayor número negativo representable (si alguna de estas opciones produce un error menor que el que se comete al aproximar por 0). En este ejercicio, sin embargo, al no haber una codificación reservada para el 0, el número está fuera del rango y, por lo tanto, no es representable en el formato especificado. h) El formato especificado tiene la forma dada por la tabla siguiente: Signo (S) Exponente (e) Mantisa 1 bit 4 bits 3 bits En primer lugar, codificaremos la magnitud 0,0001233(10 en base 2: 0,0001233 0,0002466 0,0004932 0,0009864 0,0019728 0,0039456 0,0078912 0,0157824 0,0315648 0,0631296 0,1262592 0,2525184 0,5050368 0,0100736 0,0201472 0,0402944 0,0805888 · · · · · · · · · · · · · · · · · 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 = = = = = = = = = = = = = = = = = 0,0002466 0,0004932 0,0009864 0,0019728 0,0039456 0,0078912 0,0157824 0,0315648 0,0631296 0,1262592 0,2525184 0,5050368 1,0100736 0,0201472 0,0402944 0,0805888 0,1611776 = = = = = = = = = = = = = = = = = 0 + 0,0002466 0 + 0,0004932 0 + 0,0009864 0 + 0,0019728 0 + 0,0039456 0 + 0,0078912 0 + 0,0157824 0 + 0,0315648 0 + 0,0631296 0 + 0,1262592 0 + 0,2525184 0 + 0,5050368 1 + 0,0100736 0 + 0,0201472 0 + 0,0402944 0 + 0,0805888 0 + 0,1611776 Es decir, 0,0001233(10 = 0,0000000000001000…(2. • A continuación, normalizamos la expresión obtenida (añadiendo la información del signo) en la forma ±R · 2e: –0,0001233(10 = –1,00002 · 2–13 . • Finalmente, obtenemos los diferentes elementos que definen la representación. – Signo: se trata de un número negativo; por lo tanto, el bit de signo será un 1. – Exponente: el exponente es –13(10, que hay que codificar en exceso a M = 2q–1. Puesto que disponemos de 4 bits, el exceso es M = 23 = 8. Por lo tanto, hay que representar – 13(10 + 8(10 = –5(10 con 3 bits. Ahora bien, el rango de representación de números naturales con 4 bits es [0, 24 – 1] = [0(10, 15(10] . De este modo, el exponente obtenido (–13(10) no se puede representar en el formato dado. Se produce desbordamiento a cero del exponente. Los mismos comentarios del apartado anterior se aplican también en este ejercicio. 46. a) El número representado es el 1,010(2 · 20. En esta situación, el próximo número representable es el 1,011(2 · 20 y, por lo tanto, la precisión es la diferencia entre los dos números: 0,001(2 · 20 = 2–3 = 0,125(10. Esta expresión responde a la fórmula 2–k · 2e que tenéis en el subapartado 2.4.2 de este módulo. El error de representación es la distancia entre el número representado y el número que queríamos representar. El número representado es 1,010(2 · 20 = (1 · 20 + 1 · 2–2) · 20 = (1 + 0,25) · 1 = 1,25(10, y el número que se quería representar es 1,335(10. Por lo tanto, el error cometido en la representación es ⏐1,335(10 − 1,25(10⏐ = 0,085(10. b) El número representado es el 1,011(2 · 20. Al aplicar la fórmula 2–k · 2e se obtiene que la precisión es 2−3 · 20 = 2−3 = 0,125(10. Representación de la información numérica 119 © FUOC • PID_00153515 El error de representación es la distancia entre el número representado y el número que queríamos representar. El número representado es 1,011(2 · 20 = (1 · 20 + 1 · 2–2 + 1 · 2–3) · 20 = = (1 + 0,25 + 0,125) · 1 = 1,375(10, y el número que se quería representar es 1,335(10. Por lo tanto, el error cometido en la representación es ⏐1,335(10 − 1,375(10⏐ = 0,040(10. Se puede comprobar que el error obtenido con redondeo es menor que el obtenido con truncamiento (apartado anterior). c) El número representado es el 1,010(2 · 23. Al aplicar la fórmula 2–k · 2e se obtiene que la precisión es 2–3 · 23= 20 = 1(10. El error de representación es la distancia entre el número representado y el número que queríamos representar. El número representado es 1,010(2 · 23 = (1 · 20 + 1 · 2–2) · 23 = 23 + 21 = 8 + 2 = 10(10, y el número que se quería representar es 10,0327(10. Por lo tanto, el error cometido en la representación es ⏐10,0327(10 − 10(10⏐ = 0,0327(10. d) El resultado obtenido con redondeo es el mismo que el obtenido con truncamiento. Por lo tanto, la solución dada en el apartado anterior también es válida para este apartado. e) Puesto que el número no es representable en el formato dado, no se puede calcular ni la precisión ni el error de representación. f) Puesto que el número no es representable en el formato dado, no se puede calcular ni la precisión ni el error de representación. g) Puesto que el número no es representable en el formato dado, no se puede calcular ni la precisión ni el error de representación. h) Puesto que el número no es representable en el formato dado, no se puede calcular ni la precisión ni el error de representación. 47. a) El formato especificado tiene la forma dada por la siguiente tabla: Signo (S) Exponente (e) Mantisa 1 bit 5 bits 10 bits El número mayor que se puede representar es aquel que tiene signo positivo (0) y el resto de los bits a 1: Signo (S) Exponente (e) Mantisa 0 11111 1111111111 El número representado es el siguiente: • Exponente: el exceso será M = 2q–1 = 24 = 16(10. Entonces, el exponente vale e = 11111(2 – – 16(10 = (24 + 23 + 22 + 21 + 20) – 16 = (16 + 8 + 4 + 2 + 1) – 16 = 31 – 16 = 15(10. • La mantisa está normalizada en la forma 1, X con bit implícito y toma el valor R = 1,1111111111(2 = 2 0 + 2 –1 + ... + 2–10 = 2 1 – 2–10 = 2 – 2–10. • Por tanto, el mayor número que se puede representar es (2 – 2–10) · 215 = 215 – 25 = 65536 – 32 = = +65504(10. b) El formato especificado tiene la forma dada por la siguiente tabla: Signo (S) Exponente (e) Mantisa 1 bit 6 bits 3 bits El mayor número que se puede representar es aquel que tiene signo positivo (0) y el resto de los bits a 1: Signo (S) Exponente (e) Mantisa 0 111111 111 El número representado es el siguiente: • Exponente: el exceso será M = 2q–1 = 25 = 32(10. Entonces, el exponente vale e = 111111(2 – 32(10 = = (25 + 24 + 23 + 22 + 21 + 20) – 32 = (32 + 16 + 8 + 4 + 2 + 1) – 32 = 63 – 32 = 31(10. Representación de la información numérica 120 © FUOC • PID_00153515 • La mantisa está normalizada en la forma 1,X con bit implícito y toma el valor R = 1,111 (2 = = 20 + 2–1 + 2–2 + 2–3 = 21 – 2–3 = 2 – 2–3. • Por lo tanto, el mayor número que se puede representar es (2 – 2 –3) · 231 = 2 32 – 2 28 = = 4294967296 – 268435456 = +4026531840(10 = +4,026531840(10 · 109. 48. El formato especificado tiene la forma dada por la siguiente tabla: Signo (S) Exponente (e) Mantisa 1 bit 5 bits 10 bits Y sabemos que el rango de representación de los formatos de coma flotante es el siguiente: [–(2 – 2–k) · 2M–1, –2–M ] ∪ [+2–M, +(2 – 2–k) · 2M–1] Hay que comprobar que el número 2,89(10 · 1010 no pasa del límite superior de los números positivos representables. Por lo tanto, tenemos que evaluar el número (2 – 2–k) · 2M–1 y comprobar a qué valor decimal corresponde. Para esto, es necesario determinar los valores de k y M. Puesto que tenemos un formato con 10 bits de mantisa normalizada en la forma 1,X y bit implícito, k (el número de bits de la parte fraccionaria) es igual a 10. Por otro lado, el exceso de la representación del exponente es M = 2q–1 y q = 5 (el número de bits del exponente). Por lo tanto, M = 24 = 16(10. Así pues: (2 – 2–k) · 2M–1 = (2 – 2–10) · 216–1 = (2 – 2–10) · 215 = (216 – 25) = 65536 – 32 = 65504(10. Dado que 2,89(10 · 1010 > 65504(10 podemos concluir que este número no es representable en el formato dado. 49. El formato específico tiene la forma dada por la tabla siguiente: Signo (s) Exponente (e) Mantisa 1 bit 6 bits 3 bits Y sabemos que el rango de representación de los formatos de coma flotante es el siguiente: [–(2 – 2–k) · 2M–1, –2–M ] ∪ [+2–M, +(2 – 2–k) · 2M–1] Es necesario comprobar que el número –1256(10 · 10–2 = –12,56(10 está dentro del rango de los números negativos representables, es decir, [–(2 – 2–k) · 2M–1, –2–M ]. Por este motivo, hay que determinar los valores de k y M. Puesto que tenemos un formato con 3 bits de mantisa normalizada en la forma 1,X y bit implícito, k (el número de bits de la parte fraccionaria) es igual a 3. Por otro lado, el exceso de la representación del exponente es M = 2q–1 y q = 6 (el número de bits del exponente). Por lo tanto, M = 25 = 32(10. Así pues: –2–M = –2–32 ≈ –2,328306437(10 · 10–10 –(2 – 2–k) · 2M–1 = –(2 – 2–3) · 232–1 = –(2 – 2–3) · 231 = –(232 – 228) = = –4294967296 + 268435456 = –4026531840(10 = –4,026531840(10 · 109 Por lo tanto, dado que –12,56(10 ∈ [–2,328306437(10 · 10–10, –4,026531840(10 · 109], hay que comprobar si éste es uno de los números representables de este formato en este intervalo. Para hacerlo, calculamos la representación de este valor en el formato especificado en el enunciado. En primer lugar, codificaremos la magnitud 12,5(10 en base 2. • La parte entera es 12(10: 12 6 3 1 = = = = 6·2 3·2 1·2 0·2 + + + + 0 0 1 1 Es decir, 12(10 = 1100(2. • Por lo que respecta a la parte fraccionaria: 0,56 0,12 0,24 0,48 0,96 0,92 ·2 ·2 ·2 ·2 ·2 ·2 = = = = = = 1,12 0,24 0,48 0,96 1,92 1,84 = = = = = = 1 + 0,12 0 + 0,24 0 + 0,48 0 + 0,96 1 + 0,92 1 + 0,84 Representación de la información numérica 121 © FUOC • PID_00153515 Así pues, 0,56(10 = 0,100011...(2 y nos detenemos porque ya tenemos muchos más bits de los que permite representar este formato. • Ahora, se juntan las dos partes de la magnitud y obtenemos 12,56(10 ≈ 1100,100011(2. • Seguidamente, normalizamos la expresión obtenida (añadiendo la información del signo) en la forma ±R · 2e: –12,56(10 ≈ –1,100100011(2 · 23. • Finalmente, obtenemos los diferentes elementos que definen la representación: – Signo: se trata de un número negativo, por lo tanto, el bit de signo será un 1. – Exponente: El exponente es 3(10 que hay que codificar en exceso a M = 2q–1. Dado que disponemos de 6 bits, el exceso es M = 25 = 32. Por lo tanto, hay que representar 3(10 + 32(10 = 35(10 con 6 bits: 1 + 2 17 · = 35 1 + 2 8 · = 17 0 + 2 4 · = 8 0 + 2 2 · = 4 0 + 2 1 · = 2 1 + 2 0 · = 1 Es decir e = 35(10 = 100011(2 (en exceso a 32). – Mantisa: R = 1,100100011(2. Como hay bit implícito (1,X), sólo hay que representar la parte de la derecha de la coma y disponemos de 3 bits (con truncamiento). Así, la mantisa serán los tres bits a partir de la coma: 100. – Ahora ya podemos juntar todas las partes: Signo (S) Exponente (e) Mantisa 1 100011 100 Es decir, la representación es 1100011100. Al haber tenido que truncar la mantisa, podemos concluir que el número –12,56(10 no se puede representar en el formato dado, sino que hay que aproximarlo (en este caso, la aproximación se ha hecho por el truncamiento). 50. a) El formato especificado tiene la forma dada por la tabla siguiente: Signo (S) Exponente (e) Mantisa 1 bit 5 bits 10 bits Y sabemos que el rango de representación de los formatos de coma flotante es el siguiente: [–(2 – 2–k) · 2M–1, –2–M ] ∪ [+2–M, +(2 – 2–k) · 2M–1] Dado que tenemos un formato con 10 bits de mantisa normalizada en la forma 1,X y bit implícito, k (el número de bits de la parte fraccionaria) es igual a 10. Por otro lado, el exceso de la representación del exponente es M = 2q–1 y q = 5 (el número de bits del exponente). Por lo tanto, M = 24 = 16(10. Así pues: 2–M = 2–16 = 1,52587890625(10 · 10–5 (2 – 2–k) · 2M–1 = (2 – 2–10) · 216–1 = (2 – 2–10) · 215 = (216 – 25) = 65536 – 32 = 65504(10 Por lo tanto, el rango de representación es el siguiente: [–65504(10, –1,52587890625(10 · 10–5] ∪ [+1,52587890625(10 · 10–5, 65504(10] b) El formato especificado tiene la forma dada por la tabla siguiente: Signo (S) Exponente (e) Mantisa 1 bit 6 bits 3 bits Y sabemos que el rango de representación de los formatos de coma flotante es el siguiente: [–(2 – 2–k) · 2M–1, –2–M ] ∪ [+2–M, +(2 – 2–k) · 2M–1] Representación de la información numérica 122 © FUOC • PID_00153515 Puesto que tenemos un formato con 3 bits de mantisa normalizada en la forma 1,X y bit implícito, k (el número de bits de la parte fraccionaria) es igual a 3. Por otro lado, el exceso de la representación del exponente es M = 2q–1 y q = 6 (el número de bits del exponente), y por lo tanto, M = 25 = 32(10. Así pues: 2–M = 2–32 ≈ 2,328306437(10 · 10–10 (2 – 2–k) · 2M–1 = (2 – 2–3) · 232–1 = (2 – 2–3) · 231 = (232 – 228) = 4294967296 – 268435456 = =4026531840(10 = 4,026531840(10 · 109 Por lo tanto, el rango de representación es el siguiente: [–4,026531840(10 · 109, –2,328306437(10 · 10–10] ∪ [+2,328306437(10 · 10–10, +4,026531840(10 · 109] 51. a) 00110010 + 00110101 Primero descodificaremos los dos números. Empezamos por 00110010. En primer lugar, hay que identificar los distintos elementos que componen este formato. Signo (S) Exponente (e) Mantisa 0 01100 10 • Bit de signo S = 0, por lo tanto, se trata de un número positivo. • Exponente: tenemos q = 5 (5 bits para el exponente). Por lo tanto, el exceso será M = 2q–1 = = 24 = 16(10. Entonces, el exponente vale e = 01100(2 – 16(10 = (23 + 22) – 16 = (8 + 4) – 16 = = 12 – 16 = –4(10. • Finalmente, los dos bits que quedan forman la mantisa que, puesto que está normalizada en la forma 1,X con bit implícito, toma el valor R = 1,10(2. • Por lo tanto, se trata del número +1,10(2 · 2–4. En lo que respecta al segundo sumando, tenemos lo siguiente: Signo (S) Exponente (e) Mantisa 0 01101 01 • Bit de signo S = 0, por lo tanto, se trata de un número positivo. • Exponente: el exponente vale e = 01101(2 – 16(10 = (23 + 22 + 20) – 16 = (8 + 4 +1) – 16 = = 13 – 16 =–3(10. • Finalmente, los dos bits que quedan forman la mantisa que, puesto que está normalizada en la forma 1,X con bit implícito, toma el valor R = 1,01(2. • Por lo tanto, se trata del número +1,01(2 · 2–3. Así pues, hay que hacer la suma 1,10(2 · 2–4 + 1,01(2 · 2–3. En primer lugar, es necesario igualar los exponentes al mayor de los dos (–3): 1,10(2 · 2–4 → 0,110(2 · 2–3 Ahora ya se puede proceder a calcular la suma: 1 + 1 ← transportes 1 –3 0 , 1 1 0 (2 2 1 , 0 1 0 (2 2–3 1 1 , 0 0 0 (2 2–3 ← resultado El resultado es +10,000(2 · 2–3, que hay que normalizar en la forma ±1,X · 2e: +1,0000(2 · 2–2 y representar en el formato especificado en el enunciado: • Bit de signo S = 0, porque se trata de un número positivo. Representación de la información numérica 123 © FUOC • PID_00153515 • El exponente vale –2(10 que, expresado en exceso a 16(10, es e = –2(10 + 16(10 = 14(10. Para representarlo en base 2 aplicamos el método de las divisiones sucesivas: 14 7 3 1 = = = = 7 3 1 0 · · · · 2 2 2 2 + + + + 0 1 1 1 Es decir, el exponente es 1110(2 y, para completar los 5 bits, hay que añadir un cero a la izquierda: 01110(2. • En lo que respecta a la mantisa, tenemos R = 1,1000(2. Puesto que hay bit implícito (1,X), sólo es necesario representar la parte de la derecha de la coma y disponemos de 2 bits (con truncamiento, porque el enunciado no especifica lo contrario). Así pues, la mantisa serán los dos primeros bits a partir de la coma: 10. • Al juntar todas las partes, se obtiene la siguiente representación: Signo (S) Exponente (e) Mantisa 0 01110 10 Es decir, en la representación dada 00110010 + 00110101 = 01111000. b) 10100101 + 10100100 Procedemos como en el apartado anterior y descodificaremos los dos números. Empezamos por 10100101. En primer lugar, hay que identificar los diferentes elementos que componen este formato. Signo (s) Exponente (e) Mantisa 1 01001 01 • Bit de signo S = 1; por lo tanto, se trata de un número negativo. • Exponente: e = 01001(2 – 16(10 = (23 + 20) – 16 = (8 + 1) – 16 = 9 – 16 = –7(10. • Finalmente, los dos bits que quedan forman la mantisa que, puesto que está normalizada en la forma 1,X con bit implícito, toma el valor R = 1,01(2. • Por lo tanto, se trata del número –1,01(2 · 2–7. En lo que respecta al segundo sumando, tenemos lo siguiente: Signo (S) Exponente (e) Mantisa 1 01001 00 • Bit de signo S = 1; por lo tanto, se trata de un número negativo. • Exponente: e = 01001(2 – 16(10 = (23 + 20) – 16 = (8 + 1) – 16 = 9 – 16 = –7(10. • Finalmente, los dos bits que quedan forman la mantisa que, puesto que está normalizada en la forma 1,X con bit implícito, toma el valor R = 1,00(2. • Por lo tanto, se trata del número –1,00(2 · 2–7. Así pues, hay que hacer la suma –1,01(2 · 2–7 + (–1,00(2 · 2–7). Dado que los exponentes son iguales, se puede proceder a hacer la suma directamente: ← transportes 1 − 1 , 0 1 (2 · 2–7 + − 1 , 0 0 (2 · 2–7 − 1 0 , 0 1 (2 · 2–7 ← resultado El resultado es –10,01(2 · 2–7, que hay que normalizar en la forma ±1,X · 2e: –1,001(2 · 2–6 y representar en el formato especificado en el enunciado: • Bit de signo S = 1, porque se trata de un número negativo. Representación de la información numérica 124 © FUOC • PID_00153515 Representación de la información numérica • El exponente vale –6(10 que, expresado en exceso a 16(10, es e = –6(10 + 16(10 = 10(10. Para representarlo en base 2, aplicamos el método de las divisiones sucesivas: 10 5 2 1 = = = = 5 2 1 0 · · · · 2 2 2 2 + + + + 0 1 0 1 Es decir, el exponente es 1010(2 y, para completar los 5 bits, hay que añadir un cero a la izquierda: 01010(2. • En lo que respecta a la mantisa, tenemos R = 1,001(2. Puesto que hay bit implícito (1,X), sólo se debe representar la parte de la derecha de la coma y disponemos de 2 bits (con truncamiento, porque el enunciado no especifica lo contrario). Así pues, la mantisa será los primeros dos bits a partir de la coma: 00. • Al juntar todas las partes, se obtiene la representación siguiente: Signo (S) Exponente (e) Mantisa 1 01010 00 Es decir, en la representación dada 10100101 + 10100100 = 10101000. c) 11110010 + 10111011 Aplicamos el mismo método que en los apartados anteriores. Empezamos por descodificar 11110010. En primer lugar, hay que identificar los diferentes elementos que componen este formato: Signo (S) Exponente (e) Mantisa 1 11100 10 • Bit de signo S = 1; por lo tanto, se trata de un número negativo. • El exponente vale e = 11100(2 – 16(10 = (24 + 23 + 22) – 16 = (16 + 8 + 4) – 16 = 12(10. • Finalmente, los dos bits que quedan forman la mantisa que, puesto que está normalizada en la forma 1,X con bit implícito, toma el valor R = 1,10(2. • Por lo tanto, se trata del número –1,10(2 · 212. En lo que respecta al segundo sumando, tenemos lo siguiente: Signo (S) Exponente (e) Mantisa 1 01110 11 • Bit de signo S = 1; por lo tanto, se trata de un número negativo. • Exponente: el exponente vale e = 01110(2 – 16(10 = (23 + 22 + 21) – 16 = (8 + 4 + 2) – 16 = 14 – 16 = –2(10. • Finalmente, los dos bits que quedan forman la mantisa que, dado que está normalizada en la forma 1,X con bit implícito, toma el valor R = 1,11(2. • Por lo tanto, se trata del número –1,11(2 · 2–2. Así pues, hay que hacer la suma –1,10(2 · 212 + (–1,11(2 · 2–2). En primer lugar, es necesario igualar los exponentes al mayor de los dos (12): 1,11(2 · 2–2 = 0,0111(2 · 20 = 0,0000000000000111(2 · 212 Ahora ya se puede proceder a calcular la suma: ← transportes – 212 1 , 1 0 + – 0 , 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 (2 212 – 1 , 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 (2 212 ← resultado El resultado es –1,1000000000000111(2 · 212, que ya está normalizado en la forma ±1,X · 2e y hay que representarlo en el formato especificado en el enunciado: • Bit de signo S = 1, porque se trata de un número negativo. 125 © FUOC • PID_00153515 • El exponente vale 12(10 que, expresado en exceso a 16(10, es e = 12(10 + 16 (10 = 28 (10 = = 11100(2. Dado que se trata del mismo valor que teníamos para el primer sumando, no hay que aplicar el método de divisiones sucesivas, sino que tenemos directamente la representación en base 2. • En lo que respecta a la mantisa, tenemos R = 1,1000000000000111(2. Dado que hay bit implícito (1,X), sólo es necesario representar la parte de la derecha de la coma y disponemos de 2 bits (con truncamiento, porque el enunciado no especifica lo contrario). Así pues, la mantisa serán los dos primeros bits a partir de la coma: 10. • Al juntar todas las partes, se obtiene la siguiente representación: Signo (S) Exponente (e) Mantisa 1 11100 10 Es decir, en la representación dada 11110010 + 10111011 = 111110010. Observemos que el resultado de la suma es idéntico al primer sumando. Esto es habitual en formatos de coma flotante cuando uno de los dos sumandos tiene una magnitud mucho mayor que el otro. 52. Para empaquetar, sólo hay que agrupar los bits de 4 en 4 y hacer su cambio de base a hexadecimal. En este caso, tenemos los grupos 1011 | 0001: 1011(2 = B(16 0001(2 = 1(16 Ahora, agrupamos todos estos dígitos en una única cadena y obtenemos 10110001(2 → B1h. 53. Procedemos de manera análoga al ejercicio anterior, agrupando los bits de 4 en 4: 0100 | 0001 | 1111 | 1010 y haciendo el cambio de base de cada grupo: 0100(2 = 4(16 0001(2 = 1(16 1111(2 = F(16 1010(2 = A(16 Ahora, agrupamos todos estos dígitos en una sola cadena y obtenemos 0100000111111010(2→ → 41FAh. Observad que no hemos hecho un cambio de base del número fraccionario representado por la cadena de bits original, sino que hemos empaquetado los bits de una manera en la que resulta más cómodo trabajar. 54. En primer lugar, codificaremos el número 1,125(10 en base 2: • La parte entera es 1(10 = 1(2: 1 = 0·2 + 1 • En lo que respecta a la parte fraccionaria: 0,125 0,25 0,5 ·2 ·2 ·2 = = = 0,25 0,5 1,0 = = = 0 + 0,25 0 + 0,5 1+0 Así pues, 0,125(10 = 0,001(2. • Ahora, se juntan las dos partes de la magnitud y obtenemos 1,125(10 = 1,001(2 que, representado con 8 bits para la parte fraccionaria y 4 para la parte entera, es 1,001(2 = 0001,00100000(2 (hemos añadido tres ceros a la izquierda de la parte entera y cinco ceros a la derecha de la parte fraccionaria). Así pues, en el formato especificado en el enunciado tenemos la secuencia de bits 000100100000(2. Para empaquetarla en hexadecimal, hay que agrupar los bits de 4 en 4: 0001 | 0010 | 0000 y hacer el cambio de base para cada grupo: 0001(2 = 1(16 0010(2 = 2(16 0000(2 = 0(16 Ahora, agrupamos todos estos dígitos en una única cadena y obtenemos 000100100000(2 → → 120h. De nuevo, hay que comentar que no hemos hecho un cambio de base, porque claramente 1,125(10 ≠ 120(16. Representación de la información numérica 126 © FUOC • PID_00153515 55. En primer lugar, tomamos cada uno de los dígitos que forman la cadena y obtenemos su codificación binaria: A(16 = 1010(2 8(16 = 1000(2 3(16 = 0011(2 56. A continuación, montamos una sola cadena de bits juntando los tres grupos obtenidos: A83h 101010000011(2. Si interpretan esta cadena de bits como un número natural, podemos calcular su valor decimal aplicando el TFN: 101010000011(2 = 211 + 29 + 27 + 21 + 20 = 2048 + + 512 + 128 + 2 + 1 = 2691(10. 57. Del ejercicio anterior, ya sabemos que A83h → 101010000011(2. Si interpretan esta cadena de bits como un número de coma flotante de 12 bits, con la mantisa normalizada de la forma 1,X, bit implícito y 4 bits para el exponente, tenemos lo siguiente: Signo (S) Exponente (e) Mantisa 1 0101 0000011 Por lo tanto, podemos obtener el valor decimal como sigue. • Bit de signo S = 1; por lo tanto, se trata de un número negativo. • Exponente: tenemos 4 bits para el exponente (q = 4). Por lo tanto, el exceso será M = 2q–1 = 23 = 8(10. Entonces, el exponente vale e = 0101(2 – 8(10 = (22 + 20) – 8 = (4 + 1) – 8 = 5 – 8 = –3(10. • Finalmente, los 7 bits que quedan forman la mantisa que, puesto que está normalizada en la forma 1,X con bit implícito, toma el valor R = 1,0000011(2. Ahora ya podemos calcular el número representado en base 10 aplicando la fórmula ±R · 2e y el TFN: –1,0000011(2 · 2–3 = –(20 + 2–6 + 2–7) · 2–3 = –(2–3 + 2–9 + 2–10) = –0,1279296875(10. 57. En primer lugar, tomamos cada uno de los dígitos que forman la cadena y obtenemos su codificación binaria: B(16 = 1011(2 5(16 = 0101(2 A continuación, montamos una única cadena de bits juntando los dos grupos obtenidos: B5h→ 10110101(2. Si interpretamos esta cadena como un número entero codificado en exceso a 10(10, tenemos que 10110101(2 = X + 10(10; por lo tanto: X = 10110101(2 – 10(10 = (27 + 25 + 24 + 22 + 20) – 10 = (128 + 32 + 16 + 4 + 1) – 10 = = 181 – 10 = 171(10. Es decir, la cadena representa el número 171(10. 58. En primer lugar, codificamos en binario con 4 bits cada uno de los dígitos del número: 1(10 = 0001(2 2(10 = 0010(2 5(10 = 0101(2 Y finalmente, formamos una única tira con todos los bits 000100100101(2. 59. Como en el apartado anterior, en primer lugar codificamos en binario con cuatro bits cada uno de los dígitos del número: 6(10 = 0110(2 3(10 = 0011(2 7(10 = 0111(2 Y finalmente, formamos una única tira con todos los bits 011000110111(2. 60. Separamos la tira de bits en grupos de 4 y comprobamos qué número decimal representan. Tenemos 000100111000(2 → 0001 | 0011 | 1000; por lo tanto: 0001(2 = 1(10 0011(2 = 3(10 1000(2 = 8(10 Y finalmente, construimos el número decimal juntando los dígitos decimales: 138(10. Representación de la información numérica 127 © FUOC • PID_00153515 61. Para codificar 427(10 en BCD, primero codificamos en binario con 4 bits cada uno de los dígitos del número: 4(10 = 0100(2 2(10 = 0010(2 7(10 = 0111(2 Y por último, formamos una sola tira con todos los bits 010000100111(2. Para codificar el mismo número en binario, es necesario aplicar el método de las divisiones sucesivas por la base de llegada (2): 427 213 106 53 26 13 6 3 1 = = = = = = = = = 213 106 53 26 13 6 3 1 0 ·2 ·2 ·2 ·2 ·2 ·2 ·2 ·2 ·2 + + + + + + + + + 1 1 0 1 0 1 0 1 1 Por lo tanto, 427(10 = 110101011(2. En el caso de la codificación BCD, se necesitan 12 bits para representar el número 427(10. En cambio, la codificación binaria sólo necesita 9. Ejercicios de autoevaluación 1. Para codificar el −10(10, aplicaremos primero el procedimiento de divisiones sucesivas para pasar a base 2 el módulo del número (10). 10 5 2 1 = = = = 5 2 1 0 ·2 ·2 ·2 ·2 + + + + 0 1 0 0 Por lo tanto, 10(10 = 1010(2. Si ahora queremos codificar el −10(10, lo que haremos será aplicar la operación de complemento sobre el módulo con los 8 bits de la representación final: 0 0 0 0 1 0 1 0 ←valor numérico inicial ← transporte 1 1 1 1 1 0 1 0 1 ←complemento bit a bit de la expresión inicial 1 ←sumamos 1 al bit menos significativo del formato + 1 1 1 1 0 1 1 0 Por lo tanto, −10(10 codificado en complemento a 2 y 8 bits es 11110110(2. Para conseguir la codificación en signo y magnitud, sólo hay que codificar el signo (1, ya que es negativo) y añadir la magnitud representada en 7 bits. De esta manera, el número −10(10 codificado en signo y magnitud es 10001010(2. Para codificar el −10(10 en exceso a 128(10 será necesario codificar el −10(10 + 128(10 = 118(10. El 118(10 en binario lo encontramos si aplicamos el algoritmo de divisiones sucesivas: 118 59 29 14 7 3 1 = = = = = = = 59 29 14 7 3 1 0 ·2 ·2 ·2 ·2 ·2 ·2 ·2 + + + + + + + 0 1 1 0 1 1 1 Por lo tanto, 118(10 = 1110110(2 . Consiguientemente, −10(10 codificado en exceso a 128 es 01110110(2. 2. a) Si se trata de un número en complemento a 2, sabemos que el número es positivo, ya que el primer dígito es 0. Por lo tanto, sólo habrá que aplicar el TFN para conocer el módulo: Representación de la información numérica 128 © FUOC • PID_00153515 00100100(2 = 25 + 22 = 36(10. Si está codificado el complemento a 2, el número representado es el +36(10. b) Si se trata de un número codificado en signo y magnitud, es un número positivo, ya que el primer dígito corresponde al signo y es cero. El resto de los dígitos codifican la magnitud en binario que podemos pasar a base 10 si aplicamos el TFN: 0100100(2 = 25 + 22 = 36(10. Por lo tanto, el número codificado en signo y magnitud es el +36(10. Podemos ver que coincide con la interpretación en Ca2. Esto se debe a que se trata de un número positivo. Los números positivos presentan la misma codificación en signo y magnitud que en Ca2. c) Si se trata de un número codificado en exceso a 128(10 y queremos conocer el valor decimal que representa, debemos hacer la siguiente operación: 00100100(2 − 128(10 = 00100100(2 − 10000000(2 = 36(10 − 128(10 = −92(10 Por lo tanto, el número codificado es −92(10. 3. ← transportes 1 1 1 1 1 1 0 1 0 1 0 1 1 0 0 (2 + 1 1 1 1 0 0 0 0 1 0 0 1 0 (2 1 1 1 0 0 1 0 1 1 1 1 1 0 (2 ← resultado ↑ desbordamiento Como se puede observar, se produce un fenómeno de desbordamiento. Por lo tanto, el resultado no se puede almacenar en el número de bits disponibles. El resultado es incorrecto. 4. Para codificar este número, aplicaremos el procedimiento de divisiones sucesivas primero para la parte entera y después para la parte fraccionaria. 12 = 6 · 2 + 0 16 = 3 · 2 + 0 13 = 1 · 2 + 1 11 = 0 · 2 + 1 Por lo tanto, 12(10=1100(10 0,346 · 2 = 0,692 = 0,692 + 0 0,692 · 2 = 1,384 = 0,384 + 1 0,384 · 2 = 0,768 = 0,768 + 0 0,768 · 2 = 1,536 = 0,536 + 1 Por lo tanto, 0,346(10 = 0,0101…(2. Finalmente, si juntamos las dos partes obtenemos: 12,346(10 = 1100,0101…(2. Puesto que sólo se dispone de tres dígitos para la parte fraccionaria, y se utiliza una aproximación por truncamiento: 12,346(10 = 1100,010(2. El número +12,346(10 codificado en el formato indicado es 01100010. 5. El formato especificado tiene la forma dada por la siguiente tabla: Signo (S) Exponente (e) Mantisa 1 bit 4 bits 3 bits • Codificaremos la magnitud 12,346(10 en base 2. Como se puede ver en la solución de la actividad 4 de autoevaluación, 12,346(10 = 1100,0101... (2. • A continuación, normalizamos la expresión obtenida (añadiendo la información del signo) en la forma ±R · 2e: +12,346(10 +1,1000101(2 · 23. • Finalmente, obtenemos los distintos elementos que definen la representación. – Signo: se trata de un número negativo. Por lo tanto, el bit de signo será un 0. Representación de la información numérica 129 © FUOC • PID_00153515 – Exponente: el exponente es 3(10, que hay que codificar en exceso a M = 2q–1. Ya que disponemos de 4 bits, el exceso es M = 23 = 8. Por lo tanto, hay que representar 3(10 + 8(10 = 11(10 con 4 bits: 11 = 5·2 + 1 5 2 = = 2·2 1·2 + + 1 0 1 = 0·2 + 1 Es decir, e = 11(10 = 1011(2 (en exceso a 8). – Mantisa: R = 1,1000101(2. Puesto que hay bit implícito (1,X), sólo es necesario representar la parte derecha de la coma y disponemos de 3 bits (con truncamiento). Así pues, la mantisa serán los tres bits a partir de la coma: 100. – Ahora ya podemos juntar todas las partes: Signo (S) Exponente (e) Mantisa 0 1011 100 Es decir, la representación es 01011100. 6. Para codificar un número en BCD, debemos codificar cada dígito decimal en cuatro dígitos binarios. Si juntamos las codificaciones, conseguimos la representación en BCD: 1(10 = 0001(2 7(10 = 0111(2 8(10 = 1000(2 Y finalmente, el número 178(10 codificado en BCD es 000101111000(2. 7. En primer lugar, desempaquetaremos el número y convertiremos cada dígito hexadecimal en cuatro dígitos binarios: 378 = 001101111000(2 En segundo lugar, hay que identificar los diferentes elementos que componen este formato: Signo (S) Exponente (e) Mantisa 0 0110111 1000 – Bit de signo S = 0; por lo tanto, se trata de un número negativo. – Exponente: puesto que la mantisa es de 4 bits, quedan 7 bits (0110111(2) para el exponente (q = 7). Por lo tanto, el exceso será M = 2 q–1 = 26 = 64 (10. Entonces, el exponente vale e = 0110111(2 – 64(10 = (25 + 24 + 22 + 21 + 20) – 64 = (32 + 16 + 4 + 2 + 1) – 64 = 55 – 64 = – 9(10. – Finalmente, los cuatro bits que quedan forman la mantisa que, puesto que está normalizada en la forma 1,X con bit implícito, toma el valor R = 1,1000(2. – Ahora, ya podemos calcular el número representado en base 10 aplicando la fórmula ±R · 2e y el TFN: –1,1000(2 · 2−9 = –(20 + 2–1) · 2−9 = –(2−9 + 2−10) = –(0,001953125 + 0,0009765625) = = –0,0029296875(10. 8. Para codificar el número −45(10 en complemento a 2 es necesario, en primer lugar, expresar en binario el módulo (45(10). Esto lo conseguiremos si aplicamos el algoritmo de divisiones sucesivas: 45 = 22 · 2 + 1 22 = 11 · 2 + 0 11 = 15 · 2 + 1 15 = 12 · 2 + 1 12 = 11 · 2 + 0 11 = 10 · 2 + 1 Representación de la información numérica 130 © FUOC • PID_00153515 Por lo tanto, 45(10 = 101101(2. Puesto que el número −45(10 es negativo, se deberá representar en 8 bits la magnitud positiva y hacer un cambio de signo: 0 0 1 0 1 1 0 1 ← valor numérico inicial 1 1 0 1 0 0 1 0 ← complemento bit a bit de la expresión inicial + 1 ← sumamos 1 al bit menos significativo del formato 1 1 0 1 0 0 1 1 El número −45(10 codificado en complemento a 2 es 11010011(2. Para empaquetar esta cadena de bits, debemos hacer grupos de 4 bits y después codificarlos en hexadecimal. 1101(2 = D(16 0011(2 = 3(16 Finalmente, el número codificado y empaquetado en hexadecimal es D3(16. 9. Lo primero que haremos será codificar en binario el número. Lo haremos con el algoritmo de divisiones sucesivas, por separado en la parte entera y la fraccionaria: 35 = 17 · 2 + 1 17 = 18 · 2 + 1 18 = 14 · 2 + 0 14 = 12 · 2 + 0 12 = 11 · 2 + 0 11 = 10 · 2 + 1 Por lo tanto, 35(10 = 100011(2 0,25 2 = 0,5 2 = 0,5 1,0 = = 0,5 0 + + 0 1 Por lo tanto, 0,25(10 = 0,01 (2 Si juntamos las dos partes, obtenemos: 35,25(10 = 100011,01(2. Para representar la parte entera necesitamos 6 bits, y para representar la parte fraccionaria son necesarios 2 bits. Además, necesitamos un bit para representar el signo. Por lo tanto, serán necesarios nueve dígitos, de los cuales dos se tienen que destinar a la parte fraccionaria. El número codificado en este formato es: 110001101(2. 9. Lo primero que haremos será codificar en binario los números que nos han dado. Lo haremos con el algoritmo de divisiones sucesivas. Primero lo aplicaremos sobre la parte entera, y después sobre la parte fraccionaria. 12 = 6 · 2 + 0 16 = 3 · 2 + 0 13 = 1 · 2 + 1 11 = 0 · 2 + 1 Por lo tanto, 12(10=1100 (2 0,25 · 2 = 0,5 = 0,5 + 0 0,5 · 2 = 1,0 = 0 + 1 Por lo tanto, 0,25(10 = 0,01(2. Y si juntamos las dos partes, obtenemos: 12,25(10 = 1100,01(2. Finalmente, si añadimos el bit de signo (que es cero) y la magnitud en 8 bits de los cuales 2 son fraccionarios, tenemos: +12,25(10 = 0001100,01(2 32 = 16 · 2 + 0 16 = 18 · 2 + 0 18 = 14 · 2 + 0 14 = 12 · 2 + 0 12 = 11 · 2 + 0 11 = 10 · 2 + 1 Representación de la información numérica 131 © FUOC • PID_00153515 Por lo tanto, 32(10=100000(2 0,5 · 2 = 1,0 = 0,0 + 1 Por lo tanto, 0,5(10 = 0,1 (2. Y si juntamos las dos partes, obtenemos: 32,5(10 = 100000,1(2. Finalmente, si añadimos el bit de signo (que es cero) y la magnitud en 8 bits de los cuales dos son fraccionarios, tenemos: +32,5(10 = 0100000,10(2 Ahora hacemos la operación de suma: ← transportes + 0 1 0 0 0 0 0 , 1 0 (2 0 0 0 1 1 0 0 , 0 1 (2 1 1 0 1 0 0 0 , 1 1 (2 ← resultado Puesto que no hay desbordamiento, el resultado de la suma es correcto. Glosario base f Número de dígitos distintos en un sistema de numeración. BCD m Véase decimal codificado en binario. binario m Sistema de numeración en base 2. binary coded decimal m Véase decimal codificado en binario. sigla BCD bit m Abreviación de binary digit (‘dígito binario’). Corresponde a la menor unidad de información posible. Se define como la cantidad de información asociada a la respuesta de una pregunta formulada de una manera no ambigua, en la que sólo son posibles dos alternativas de respuesta y que, además, tienen la misma probabilidad de ser elegidas. bit menos significativo m Bit menos significativo (más a la derecha) de una representación numérica posicional. en less significant bit sigla LSB borrow m Transporte usado en la operación de resta. byte m Véase octeto. cadena f Conjunto de elementos de un mismo tipo dispuestos uno a continuación del otro. carry m Véase transporte. coma fija f Sistema de representación numérica que utiliza un número fijo de dígitos enteros y fraccionarios. coma flotante f Sistema de representación numérica que codifica un número variable de dígitos enteros y fraccionarios. La cantidad de dígitos enteros y fraccionarios depende del formato y del valor numérico que se representa. decimal m Sistema de numeración en base 10. decimal codificado en binario m Codificación de los dígitos decimales (0,1,2, …, 9) sobre un conjunto de cuatro dígitos binarios. en binary coded decimal sigla BCD desbordamiento m Indicación de que el resultado de una operación queda fuera del rango de representación disponible. en overflow digital m Sistema que trabaja con datos discretos. Representación de la información numérica © FUOC • PID_00153515 132 dígito m Elemento de información que puede tomar un número finito de valores distintos. El número de valores diferentes es determinado por la base de numeración. empaquetamiento m Transformación que permite representar la información binaria de una manera más compacta. formato m Descripción estructural de una secuencia de datos, donde se especifica el tipo, la longitud y la disposición de cada elemento. fraccionario m Menor que la unidad. hexadecimal m Sistema de numeración en base 16. less significant bit m Véase bit menos significativo. LSB m Véase bit menos significativo. MSB m Véase bit más significativo. octal m Sistema de numeración en base 8. octeto m Cadena de 8 bits. en byte overflow m Véase desbordamiento. palabra f Unidad de información procesada por un computador de una sola vez (en paralelo). en word precisión f Diferencia entre dos valores consecutivos de una representación. raíz f Base de un sistema de numeración. rango m Conjunto de valores que indican los márgenes entre los cuales están los valores posibles de un formato de representación. representación f Véase formato. transporte m Bit que indica que se ha superado el valor b de la base de numeración al sumar dos dígitos. La suma de dos valores numéricos se lleva a cabo dígito a dígito, progresando de derecha a izquierda. Un transporte, al sumar dos dígitos, indica que hay que añadir una unidad al hacer la suma de los dos dígitos siguientes. en carry word m Véase palabra. Bibliografía Miguel, P. de (1996). Fundamentos de los computadores (5.ª ed., cap. 2). Madrid: Paraninfo. Patterson, D.; Henessy, J. L. (1995). Organización y diseño de computadores: la interfaz hardware/software. Madrid: McGraw-Hill. Stallings, W. (1996). Organización y arquitectura de computadores: diseño para optimizar prestaciones. Madrid: Prentice Hall. Representación de la información numérica