Conversión de números Fraccionarios - Binarios

Embed Size (px)

Citation preview

  • 7/25/2019 Conversin de nmeros Fraccionarios - Binarios

    1/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 mantisaes la parte significativa del nmero (la cifra que se conoce). La caractersticaes un nmero

    entero con signo, que indica el nmero de posiciones que hay que desplazar a la derecha o a la izquierda el puntodecimal. Por esta razn, esta representacin es tambin conocida como de "punto flotante".

    La caractersticapuede ser interpretada tambin como la potencia de 10 por la que hay que multiplicar

    la mantisapara obtener el nmero. Es decir: si Ves el nmero, mla mantisa, y cla 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.

  • 7/25/2019 Conversin de nmeros Fraccionarios - Binarios

    2/4

    Para los nmeros de "punto flotante", se ha asignado un bit para el signo; un cierto nmero de bits para

    representar el exponentey 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 Vpuede ser

    representado por su mantisa my 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 representandoel 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 absolutodel mayor nmero que puede ser

    representado.

    Mantisa m:Nmero binario que representa las cifras significativas del nmero. Por supuesto, cuanto mayor

    sea la precisindeseada, mayor debe ser el espacio destinado a contener esta parte.

    Consideramos los bits numerados de derecha a izquierda, de 0 a N-1 (siendo Nel 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 ebits para contener al exponenteE,

    y mpara contener la mantisa M, el esquema de almacenamiento es:

    Espacio total de almacenamiento (bits)

    S EEEEEEEE MMMMMMMMMMMMMMMMMMMMMMM Distribucin

    1 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, larepresentacin (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.

  • 7/25/2019 Conversin de nmeros Fraccionarios - Binarios

    3/4

    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 denominaaritmtica

    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 tipodecimal

    por lo que las aplicaciones que necesitan de estos de clculos deben recurrir a librerasespecficas.

    Precisin Bytes bits

    Simple 4 32

    Doble 8 64

    Extendida >= 10>=

    80

    Cudruple 16 128

    http://forums.msdn.microsoft.com/en-US/vclanguage/thread/6b48c8ad-6920-41ba-ba9b-ae2054a35bcf/http://forums.msdn.microsoft.com/en-US/vclanguage/thread/6b48c8ad-6920-41ba-ba9b-ae2054a35bcf/
  • 7/25/2019 Conversin de nmeros Fraccionarios - Binarios

    4/4

    En todos los casos se utilizan tres campos para describir el nmero: El signo S, el exponenteky

    el significando(mantisa) n, que se almacenan en ese orden en memoria.

    El signo Sse almacena como es usual en un bit (0 significa positivo, 1 negativo).

    El exponente kse 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 nse 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

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