Herramientas de usuario

Herramientas del sitio


punto_flotante

¡Esta es una revisión vieja del documento!


Representación de números reales

Ya vimos en clases anteriores cómo se pueden representar números enteros y operar con ellos usando una cantidad fija de bits. En muchas aplicaciones es necesario representar números con decimales, números muy grandes que caen fuera del rango de representación de números enteros del procesador, o números muy cercanos a cero.

Representación de Punto Fijo

De la misma manera que podemos representar cierto rango de números enteros usando una cantidad fija de dígitos, es posible fijar además una cantidad de esos dígitos para representar la parte fraccionaria.

De esta manera podríamos representar un subconjunto de los números reales usando, por ejemplo, 8 dígitos, de los cuales 2 dígitos representan la parte fraccionaria. Luego los dígitos almacenados

12345678

representarían el valor 123456,78.

Es común usar estos tipos de datos para almacenar valores monetarios, evitando problemas de conversión de base y fijando la precisión. Por ejemplo el standard SQL define el tipo de datos DECIMAL(precision, escala), donde precision indica la cantidad de dígitos decimales (en base 10) y escala indica cuántos de ellos corresponden a la parte fraccionaria.

Sin embargo esta notación no es eficiente al momento de operar con números de magnitudes muy distintas, ya que requiere extender la precisión del resultado para no introducir errores por pérdida de dígitos significativos.

Notación científica

Una forma de representar números muy grandes, o muy pequeños de manera compacta es la notación científica. En vez de enumerar todos los dígitos que forman el número, éste se expresa como un valor multiplicado por una potencia de 10. Algunos ejemplos:

1,4959787 × 1011 mEs la distancia promedio de la tierra al sol
2,75 × 10-8 mDiámetro de una molécula de agua
6,02 × 1023Cantidad de moléculas en un mol de una substancia (número de Avogadro)

De esta manera se pueden expresar números muy grandes o muy pequeños con una cantidad limitada de dígitos significativos, ya que la magnitud del número está dada por el exponente.

En general un número expresado en notación científica es de la forma +/- m × 10e donde m, llamado mantisa o significante, es un número real mayor o igual a uno y menor a 10, y el exponente e es un número entero.

Representación de Punto Flotante

La representación de números de punto flotante usa un esquema similar a la notación científica para representar números reales, definiendo una cantidad de dígitos para la mantisa y para el exponente.

Históricamente las computadoras implementaron este tipo de datos de distintas maneras, dificultando la transmisión de datos y la portabilidad de los algoritmos. Para corregir esta situación, el IEEE (Institute of Electrical and Electronics Engineers) elaboró un standard para normalizar la representación y la operación con datos de punto flotante. Al respetar el standard IEEE-754 los fabricantes de hardware y software pueden garantizar que representan los datos de la misma manera, con operaciones que funcionan correctamente.

Standard IEEE-754

Inicialmente el standard IEEE-754 definía tres formatos de punto flotante binario, que difieren básicamente en la cantidad de bits que utilizan para el exponente y la mantisa.

SignoExponenteMantisaTotal bits
Precisión Simple1 bit8 bits23 bits32
Precisión Doble1 bit11 bits52 bits64
Precisión Extendida1 bit15 bits63 bits80

Los formatos de precisión simple y precisión doble corresponden a los tipos de datos float y double de los lenguajes C, C++ y java. El formato de precisión extendida es usado internamente por las unidades de punto flotante (FPU) para reducir el error introducido por la representación.

En este curso nos enfocaremos simplemente en la codificación y decodificación de números de punto flotante de Precisión Simple (32 bits).

Números normalizados

Dado que se trata de representaciones binarias, partiremos de la expresión binaria normalizada de un número real, es decir el número debe estar expresado de la siguiente manera:

x = (s) 1,m × 2e

Donde s representa el signo, m representa los dígitos de la parte fraccionaria, y el producto por 2e es la operación necesaria para que el valor normalizado sea igual al número original. Notar que el número debe tener un solo dígito distinto de cero en la parte entera. Esto implica que el cero no es un número normalizado, sino que tiene una representación especial.

Por ejemplo el número no normalizado 101012 es igual al valor normalizado 1,0101 × 24.

Consideraremos mantisa solamente a los dígitos binarios de la parte fraccionaria del número normalizado, asumiendo que la parte entera siempre vale 1.

  • El signo del número completo se codifica con un bit de la siguiente manera
    • s = 0: positivo
    • s = 1: negativo
  • El exponente se almacena como un número entero en exceso-n. La representación exceso-n permite almacenar números enteros como valores positivos, sumando una constante al valor original. En el caso de precisión simple, el exponente se almacena en exceso-127 (es decir, se le suma 127 y se almacena como un número binario positivo).
  • En la mantisa se almacenan solamente los dígitos de la parte fraccionaria del número normalizado
× iphelper toolbox

you see this when javscript or css is not working correct

Untested
IP Address:
First usable:
Subnet:
Last usable:
CIDR:
Amount of usable:
Network address:
Reverse address:
Broadcast address:

punto_flotante.1585107311.txt.gz · Última modificación: 2020/03/25 03:35 (editor externo)