You are on page 1of 4

Nmeros fraccionarios

A continuacin exponemos brevemente los detalles del formato utilizado para representacin interna de los
nmeros fraccionarios. Es decir, cmo son representados en forma binaria los nmeros con decimales.

Notacin cientfica
En ciencias aplicadas, es frecuente tener que utilizar nmeros muy grandes y muy pequeos. Para facilitar
su representacin, se desarroll la denominada notacin cientfica, en la que el nmero es representado mediante
dos cantidades, la mantisa y la caracterstica, separadas por la letra E/e (en esta notacin no tiene nada que ver
con la constante e).

La mantisa es la parte significativa del nmero (la cifra que se conoce). La caracterstica es un nmero
entero con signo, que indica el nmero de posiciones que hay que desplazar a la derecha o a la izquierda el punto
decimal. Por esta razn, esta representacin es tambin conocida como de "punto flotante".
La caracterstica puede ser interpretada tambin como la potencia de 10 por la que hay que multiplicar
la mantisa para obtener el nmero. Es decir: si V es el nmero, m la mantisa, y c la caracterstica, resulta: V = m .
10c. Esta notacin es equivalente a V = mec = mEc en notacin cientfica.
Ejemplos:
Expresin 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

Representacin binaria

La informtica, que en sus comienzos estaba nutrida por profesionales de otras disciplinas tcnicas y
cientficas, adopt una variacin de la notacin cientfica para representacin interna (binaria) de las cantidades
fraccionarias. Por esta razn, es costumbre que los nmeros fraccionarios sean denominados de coma o punto
flotante, y a las operaciones aritmticas realizadas con ellos, operaciones de punto flotante FLOP.

Para los nmeros de "punto flotante", se ha asignado un bit para el signo; un cierto nmero de bits para
representar el exponente y el resto para representar la parte ms significativa del nmero (la mantisa), aunque en
este caso, la caracterstica 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 caracterstica mediante: V = m . 2c.
As pues, la representacin binaria de los nmeros fraccionarios utiliza tres componentes:

Signo S: Nmero binario de un bit representando el signo (0 == positivo, 1 == negativo). Generalmente es


el bit ms significativo (de la izquierda).
Exponente c: Nmero 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 nmero que puede ser
representado.
Mantisa m: Nmero binario que representa las cifras significativas del nmero. Por supuesto, cuanto mayor
sea la precisin deseada, 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 nmero total de bits que
se utilizar en la representacin). El signo est representado por el ltimo bit (bit N-1). A continuacin le siguen los
bits destinados al significando y finalmente los del exponente. Si se destinan e bits para contener al exponente E,
y m para contener la mantisa M, el esquema de almacenamiento es:
<--------------- N --------------> Espacio total de almacenamiento (bits)
S EEEEEEEE MMMMMMMMMMMMMMMMMMMMMMM Distribucin
1 <-- e -> <---------- m --------> Longitud de campos
N-1m+e m m-1
0 Numeracin 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 podra compensarse disminuyendo o
aumentando el valor del exponente en una unidad. Para evitar ambigedades, puede ser representado en la
forma: V = 2c (1 + f)
Desgraciadamente no existe una absoluta unidad de criterio respecto a los detalles. Segn el Estndar, la
representacin (interna) y rango de valores de los nmeros fraccionarios depende del compilador. Cada
implementacin C++ es libre para definir los detalles. Por ejemplo, que espacio dedica a almacenar el exp, y cuanto
a la mantisa; como se representa el cero, etc. Como consecuencia, existen diferencias en algunos aspectos del
comportamiento de los compiladores que pueden llegar a ser cruciales.

Problemas de la representacin binaria de las cantidades fraccionarias

La representacin binaria de punto flotante utilizada en los computadores digitales, es muy eficiente y se
adapta bastante bien a la mayora de las circunstancias, especialmente en clculos tcnicos y cientficos. Sin
embargo, no est exenta de problemas, derivados del hecho de que las posibilidades (finitas) de representacin del
ordenador no pueden cubrir la totalidad (infinita) de los nmeros reales.
Esta dificultad es especialmente molesta en los clculos denominados "de gestin", "comerciales" o
"financieros" que utilizan nmeros fraccionarios de base 10. Por ejemplo clculos de precios, de conversin de
moneda o del resultado de varias pesadas. Este tipo de aplicaciones utilizan lo que se denomina aritmtica
decimal (que realizamos habitualmente con un papel y un lpiz).
Aunque funcionan igual en principio, las fracciones binarias son diferentes a las fracciones decimales en
qu nmeros que se pueden representar con precisin dado un nmero de dgitos, y por tanto tambin en qu
nmeros resultan en errores de redondeo: concretamente, en binario solo se pueden representar como una fraccin
finita aquellos nmeros en los que el denominador es una potencia de 2. Por desgracia, esto no incluye la mayora
de los nmeros que pueden ser representados como una fraccin finita en base 10, como 0.1.
Cuando en los programas C/C++ se utilizan variables fraccionarias para almacenar este tipo de variables
(nmeros fraccionarios de base 10), se presentan problemas que, en principio, suelen desconcertar al principiante.
Como muestra, se incluy el mensaje de un usuario en un foro de Visual C++, titulado "A very serious bug in MS
Visual C++":
Try the next code:
double a=111.567, b=111, c;
c=a-b;
// and you will receive
//
// a=111.56699999999999
// b=111.00000000000000
// c=0.56699999999999307
//
// instead => a=111.567, b=111, c=0.567;
I found more fractional numbers that show a similar error.
The problem is that the fractional numbers and their actions can not be produced otherwise.
I try this example in all MS Visual C/C++ compilers from version 6.0 to version 2008 and the bug appears everywhere.
Regards.

Como sntesis indicaremos aqu que, para prevenir estos problemas, algunos lenguajes incluyen un tipo
especial de variable "decimal" y funciones y operadores especficos que permiten realizar clculos de aritmtica
decimal. En lo que respecta a C++, debido a sus orgenes "cientficos", por el momento no dispone de forma nativa
de ningn tipo decimal por lo que las aplicaciones que necesitan de estos de clculos deben recurrir a libreras
especficas.

Precisin

Bytes

bits

Simple

32

Doble

64

Extendida

>= 10

>=
80

Cudruple

16

128

En todos los casos se utilizan tres campos para describir el nmero: El signo S, el exponente k y
el significando (mantisa) n, que se almacenan en ese orden en memoria.

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 nmero binario con signo segn una regla que, como veremos
a continuacin, depende del rango y del formato.
El significando n se almacena en forma normalizada, salvo cuando se representan significados especiales
(ver a continuacin).

Procedimiento
Para convertir un nmero decimal entre 0 y 1 a la base 2:
PASO 1. Realice la multiplicacin por de la parte fraccionaria obtenida en el paso anterior, comenzando con el
nmero dado.
PASO 2. Guarde la parte entera de tal producto.
PASO 3. Contine con el paso 1 hasta que la parte fraccionaria sea cero, o hasta obtener el suficiente nmero de
dgitos requeridos para su representacin.
PASO 4. Lea las partes enteras obtenidas, del principio hacia el final, para formar la representacin buscada.

Referencias
http://gcp.fcaglp.unlp.edu.ar/_media/integrantes:psantamaria:fortran:arithmetic:representacion-numeros.pdf
http://www.zator.com/Cpp/E2_2_4a.htm
http://puntoflotante.org/formats/binary/
http://www.nachocabanes.com/redes/representacionBinaria.pdf
http://www.esi2.us.es/~jaar/Datos/FIA/T2.pdf

You might also like