You are on page 1of 4

ARITMETICA DE PUNTO FLOTANTE EN C++

CHOQUE ESTEVEZ ANDRES


MAT 156 ANALISIS MATEMATICO
PARALELO “A”; HRS: 10:00 – 12:00; MAR-JUE

RESUMEN

En esta nota se describen números en formato de punto flotante, siguiendo las especificaciones
la Norma 754 de la IEEE. Las verificaciones se realizan con c ++. En esta nota las operaciones
se realizan con valores en punto flotantes en simple precisión, es decir, que cada número se
representa con 32 bits.

ABSTRACTO

They describe numbers in format of floating point in this note, following specifications the Standard
754 of her IEEE. Verifications come true with c + +. The operations come true with floating-point
moral values in simple precision, that is, in this note that each number imagines with 32 bits.

KEY WORDS: epsilon, mantissa, representable en binario, Norma IEEE 754.

1.0. Introducción.

El estándar de la IEEE para aritmética en punto flotante (IEEE


754) es el estándar más ampliamente usado en las
operaciones computacionales de punto flotante, y es utilizada
por muchas de las implementaciones de CPU y FPUi. El
estándar define formatos para la representación de números
en punto flotante (incluyendo el cero) y valores des
normalizados. También especifica cuatro modos de
redondeo y cinco excepciones (incluyendo cuando dichas
excepciones ocurren, y que sucede en dichos momentos). Figura 2.0.2.1.- Se aprecia en la figura la forma de
En C y C++ ofrecen una amplia variedad de tipos aritméticos. almacenar 32bits.
Donde S es el bit de signo y Exp es el campo exponente.
El formato de doble precisión no es requerido por los
(Para el signo: 0 = Positivo; 1= Negativo). El exponente se
estándares de estos lenguajes, también, es utilizado el desplaza un bit a la derecha, ya que tiene un bit de signo.
formato float (excepto por el Anexi F opcional de C99 que
cubre la aritmética de la norma IEEE 754), pero en la mayoría
de los sistemas el tipo de variable double corresponde a la
doble precisión. Sin embargo, en procesadores x86 de 32 bits El valor almacenado es el offset (desplazado 127) del valor
con precisión extendida por defecto, actual. El desplazamiento se realiza porque los exponentes
algunos compiladores pueden no cumplir con el estándar C pueden ser valores con signo, para permitir la representación
y/o la aritmética puede sufrir problemas de doble redondeo. de números pequeños (menores a 1) y grandes (mayores a
1).]
1.0.1. Objetivo general.
Para resolver esto, se desplaza el exponente antes de
Estudio de la aritmética punto flotante con c++. almacenarlo, ajustando su valor en un rango sin signo para
poder compararlo con otro. Así, para un número en precisión
1.0.2. Objetivo específico. simple, un exponente en el rango −126 a +127 se desplaza
mediante la suma del número 127 para obtener un valor en
Comprender la funcionalidad de punto flotante. el rango de 1 a 254 (0 y 255 tienen significados especiales
Notar la funcionalidad de punto flotante en c++. descritos más adelante). Una vez que se realizan las
operaciones deseadas en punto flotante, se vuelve a
2.0. Marco teórico. desplazar el número para obtener el exponente real con
signo.
2.0.1. Convenciones de Bit.

Los Bits dentro de una palabra de tamaño W están indexados


por enteros en el rango 0 a W−1 inclusive. El bit cuyo índice
es 0 se sitúa a la derecha. El menor bit indexado es
normalmente el menos significativo.

2.0.2. Precisión simple 32-bits. Tabla 2.0.2.1.- Se observa en la tabla la forma


de acomodar los 32 bits.
Un número en punto flotante de precisión simple se
almacena en una palabra de 32 bits.
Las clases se distinguen principalmente por el valor del • La fracción es la parte que está a la derecha del punto
campo Exp, siendo modificada esta por el campo fracción. Se decimal, se llena con ceros a la derecha hasta obtener
consideran Exp y Fracción como campos de números
binarios sin signo (Exp se encuentra en el rango 0–255): todos los 23 bits. Es decir
11011010100000000000000.
• El exponente es 6, pero se lo debe convertir a binario
y desplazarlo (de forma tal que todos los exponentes
son solamente números binarios sin signo). Para el
formato IEEE-754 de 32 bits, el desplazamiento es
127, así es que 6 + 127 = 133. En binario, esto se
escribe como 10000101

Tabla 2.0.2.2.- Se observa en la tabla la Poniendo todo junto se tiene el número en punto flotante
clasificación de valores normalizado:

El valor decimal V de un número en punto flotante viene


dado por:

V = (−1) S * 2 E * M

Donde:

S = 0 (números positivos) o S = 1 (números negativos).


E = Exp − 127 (para normalizados) o E = -126 (para des Figura 2.0.3.1.- Se aprecia en la figura un
normalizados). número en punto flotante normalizado.
M = 1,Fracción (en binario para normalizados) ; en este
caso 1 ≤ M < 2, 2.0.4. Comparación de números en punto flotante
o M = 0,Fracción (en binario para des normalizados)con lo
cual M < 1. La comparación de números en punto flotante se realiza
generalmente usando instrucciones de punto flotante. Sin
2.0.3. Características importantes de la Norma de punto embargo esta representación (IEEE 754) hace la
flotante. comparación de determinados subconjuntos posible byte-
por-byte, si comparten el mismo orden de bytes y el mismo
1. −126 es el menor exponente para un número normalizado. signo, y los NaN s son excluidos. Por ejemplo, para dos
2. Hay dos ceros. +0 (S es 0) y −0 (S es 1). números positivos a y b, a < b es cierto siempre que los
3. Hay dos infinitos +∞ (S es 0) y −∞ (S es 1). enteros binarios sin signo con los mismos patrones de bits y
4. Los NaNs pueden tener un signo y un significando, pero el mismo orden de bytes que a y b, son también ordenados
estos no tienen otro significado que el que puedan aportar en de forma a < b. En otras palabras, dos números positivos (que
pruebas de diagnostico; el primer bit del significando es a se sabe que no son NaN s) pueden ser comparados con una
menudo utilizado para distinguir los NaNs señalizados comparación entre enteros binarios sin signo entre los
(SnaN: Signalling Not a Number) de los NaNs silenciosos mismos grupos de bits, teniendo como base que los números
(QNaN: Quiet Not a Number). Los primeros es utilizado tienen el mismo orden de bytes.
cuando el dato ingresado al sistema no tiene el formato de un
número válido especificado por la norma de punto flotante. 2.0.4. Redondeo de números en punto flotante
Los QNaN especifican que la operación realizada con las
cifras ingresadas produce un valor numérico no válido.
5. Los NaNs y los infinitos tienen todos los bits puestos a 1 El estándar de la IEEE tiene cuatro formas diferentes de
en el campo Exp. redondeo:

Ejemplo: • Unbiased que redondea al número más cercano, si el


número cae en medio, este es redondeado al valor más
Para entender mejor lo antes dicho se codifica el número cercano con un valor par (cero) en su menos significativo.
decimal -118.625 usando el sistema de la IEEE 754. Para Este modo es el requerido como por defecto.
esto se debe obtener el signo, el exponente y la fracción. • Hacia el cero
• Hacia el infinito positivo
• Hacia el infinito negativo
• Dado que es un número negativo, el signo es "1".
• Se escribe el número (sin signo) usando notación Operaciones matemáticas en punto flotantes. Como se ha
binaria. El resultado es 1110110.101. visto, los números en punto flotante se representan por tres
• Se mueve el punto decimal a la izquierda, dejando campos: significando ó fracción del significando, signo del
significando y el exponente. Las operaciones de
solo un 1 a su izquierda. multiplicación y división son más fáciles de efectuar que las
1110110.101=1.110110101·26, este es un número en de suma y resta [3], como veremos a continuación.
punto flotante normalizado.
2.0.5. Épsilon

El épsilon es el número decimal más pequeño que, sumado


a 1, la computadora nos arroja un valor diferente de 1, es
decir, que no es redondeado.

Representa la exactitud relativa de la aritmética del


computador. La existencia del épsilon de la máquina es una
consecuencia de la precisión finita de la aritmética en coma
flotante.

Figura 3.0.2.1.- Se aprecia en la figura


el código para hallar el épsilon
Figura 2.0.5.1.- Se observa en la figura el
algoritmo para calcular el épsilon de la
máquina.[chapra,2011]

3.0. Marco experimental.

3.0.1. Introducción.

Emplearemos un lenguaje de programación para realizar las


pruebas de punto flotante, en este caso se realizara con c++
como lenguaje y Code-Blocks, como se observa en la en la
figura 3.0.1.1.

Figura 3.0.2.2.- Se aprecia la ejecución


del épsilon

El tipo de dato flotante en lenguaje C++ sólo tiene dos


tamaños: el float y el double , que son 4 bytes y 8 bytes
respectivamente. Se los puede utilizar tanto para representar
números decimales, como para representar números enteros
con un orden de magnitud muy grande.
La forma de declarar una variable flotante es escribiendo en
una línea uno de los tipos de datos flotantes y a continuación
el nombre de la variable y tal vez algún valor que se les quiera
dar.

Figura 3.0.1.1.- Se aprecia en la figura el


lenguaje y editor a utilizar.

3.0.2. Resultados y análisis.

El épsilon de la máquina (en este caso en c++) se emplea al


formular criterios de paro o de convergencia. Esto asegura
que los programas sean portátiles, es decir, que no sean
dependientes de la computadora sobre la cual se hayan
implementado. En la figura 3.0.2.1 se presenta un código que
automáticamente determina el épsilon de la máquina en una Figura 3.0.2.3.- Se observa los tipos de
computadora binaria. datos flotante (float) y doble (double)
Hay que tener en cuenta que aunque los valores flotantes son Los formatos en coma flotante sacrifican precisión en favor
más convenientes para algunas aplicaciones, hay casos en de tamaño.
los que se prefieren los enteros. Esto se debe a que los
números flotantes no necesariamente tienen soporte de 4.0. Conclusiones
hardware, en particular en las plataformas integradas. Una
alternativa que se utiliza en estas situaciones es interpretar Se pudo verificar
los enteros como decimales de forma que 150 se interprete
como 1.5 y 2345 como 23.45. 6.0. Bibliografía
Para el caso de los flotantes de 4 bytes, se utiliza 1 bit para
el signo, 7 bits para el exponente y 24 bits para el valor del
número. El procedimiento para almacenar un número en una
variable flotante es el siguiente:

1. Se convierte a binario la parte entera.


2. Se coloca el signo en el bit más significativo de la misma
manera que en los enteros (1 para el - y 0 para el +).
3. Se mueve la coma (en la representación binaria de la
parte entera) hasta que esté a la derecha del primer uno
y éste se descarta (el uno más significativo). El valor del
exponente será el número de posiciones que se movió
la coma. El exponente usa la representación de un
entero con complemento a dos.
4. Se convierte en binario la parte decimal del número. Esto
usando el peso de los bits. el bit decimal más significativo
vale 1/2, el siguiente vale 1/4, el otro 1/8, el otro 1/16 y
así hasta completar lo que falta para los 23bits del valor.
5. Se concatena todo y ese es el valor flotante
representado en memoria.

Las variables de este tipo almacenan números en formato de


coma flotante, esto es, contienen un valor de mantisa y otro
de exponente, que, para entendernos, codifican números con
decimales.
Aunque el formato en que se almacenan estos números en
un ordenador es binario, podemos ver cómo es posible
almacenar números muy grandes o muy pequeños mediante
dos enteros relativamente pequeños, usando potencias en
base 10. Por ejemplo, tenemos para la mantisa un valor
entero, m, entre -0.99 y 0.99, y para el exponente un
valor, e entre -9 y 9.

Los números se interpretan como m x 10e.

Este formato nos permite almacenar números entre -0.99 x


109 y 0.99 x 109. Es decir, entre -990000000 y 99000000.

Y también números tan pequeños como 0.01 x 10 -9 ó -0.01 x


10-9. Es decir, como 0,00000000001 ó -0,00000000001.

Esto sólo con tres dígitos decimales, más los signos. Pero en
un ordenador se usa aritmética binaria. Por ejemplo, para un
tipo float típico de 32 bits, se usa un bit de signo para la
mantisa y otro para el exponente, siete bits para el exponente
y 23 para la mantisa.

Estas variables son aptas para variables de tipo real, como


por ejemplo el cambio entre euros y dólares. O para números
muy grandes, como la producción mundial de trigo, contada
en granos.
Pero el fuerte de estos números no es la precisión, sino el
orden de magnitud, es decir lo grande o pequeño que es el
número que codifica.

You might also like