Numeros - Cartelera

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