Coma flotante
# Coma flotante

La representación de coma flotante (en inglés, floating point) es una forma de notación científica usada en las computadoras con la cual se pueden representar números reales extremadamente grandes y pequeños de una manera muy eficiente y compacta y con la que se pueden realizar operaciones aritméticas. El estándar actual para la representación en coma flotante es el IEEE 754.

## Notación científica

Como la representación en coma flotante es casi idéntica a la notación científica tradicional, con algunos añadidos y algunas diferencias, primero se describirá la notación científica para entender cómo funciona y luego se describirá la representación de coma flotante y las diferencias.

### Representación

La notación científica se usa para representar números reales. Siendo r el número real a representar, la representación en notación científica está compuesta por tres partes:

$r=c\cdot b^{e}\,\!$

* c. El coeficiente, formado por un número real con un solo dígito entero seguido de una coma (o punto) y de varios dígitos fraccionarios.
* b. La base, que en nuestro sistema decimal es 10, y en el sistema binario de los computadores es 2.
* e. El exponente entero, el cual eleva la base a una potencia.

**Coeficiente**

Un signo en el coeficiente indica si el número real es positivo o negativo.

El coeficiente tiene una cantidad determinada de dígitos significativos, los cuales indican la precisión del número representado, cuantos más dígitos tenga el coeficiente, más precisa es la representación. Por ejemplo, el número π puede representarse en notación científica con 3 cifras significativas, 3,14 x $10^0,$ o con 12 cifras significativas, 3,14159265359 x $10^0;$ la segunda representación tiene mucha más precisión que la primera.

**Base y exponente**

El coeficiente se multiplica por la base elevada a un exponente entero. En el sistema decimal la base es 10. Al multiplicar el coeficiente por la base elevada a una potencia entera, se desplaza la coma del coeficiente tantas posiciones (tantos dígitos) como indique el exponente. La coma se desplaza hacia la derecha si el exponente es positivo o hacia la izquierda si es negativo.

Ejemplo de cómo cambia un número al variar el exponente de la base:

* 2,71828 x $10^{-2}$ representa al número real 0,0271828
* 2,71828 x $10^{-1}$ representa al número real 0,271828
* 2,71828 x $10^0$ representa al número real 2,71828 (el exponente cero indica que la coma no se desplaza)
* 2,71828 x $10^1$ representa al número real 27,1828
* 2,71828 x $10^2$ representa al número real 271,828

### Ejemplo

Un ejemplo de número en notación científica es el siguiente:

    -1,234 567 89 x $10^3$

El coeficiente es -1,23456789, tiene 9 dígitos significativos y está multiplicado por la base diez elevada a la 3. El signo del coeficiente indica si el número real representado por la notación científica es positivo o negativo.

El valor de la potencia indica cuántas posiciones (cuántos dígitos) debe desplazarse la coma del coeficiente para obtener el número real final. El signo de la potencia indica si ese desplazamiento de la coma debe hacerse hacia la derecha o hacia la izquierda: una potencia positiva indica que el desplazamiento de la coma es hacia la derecha, mientras que un signo negativo indica que el desplazamiento debe ser hacia la izquierda. Si el exponente es cero, la coma no se desplaza ninguna posición. La razón de la denominación «coma flotante» es porque la coma se desplaza o «flota» tantos dígitos como indica el exponente de la base; al cambiar el exponente, la coma «flota» a otra posición.

En el número representado en la notación científica anterior, -1,23456789 x $10^3,$ el exponente es 3 positivo, lo que indica que la coma del coeficiente -1,23456789 debe desplazarse 3 posiciones hacia la derecha, dando como resultado el número real equivalente:

    -1234,567 89

Sigue una tabla con ejemplos de números reales de tres dígitos significativos y su representación en notación científica:

| Número real | Notación científica |
| - | - |
| 123 000 000 000 000 000 000,0 | 1,23 x $10^{20}$ |
| 123 000 000,0 | 1,23 x $10^8$ |
| 1230,0 | 1,23 x $10^3$ |
| 123,0 | 1,23 x $10^2$ |
| 12,3 | 1,23 x $10^1$ |
| 1,23 | 1,23 x $10^0$ |
| 0,123 | 1,23 x $10^{-1}$ |
| 0,012 3 | 1,23 x $10^{-2}$ |
| 0,001 23 | 1,23 x $10^{-3}$ |
| 0,000 000 012 3 | 1,23 x $10^{-8}$ |
| 0,000 000 000 000 000 000 012 3 | 1,23 x $10^{-20}$ |

Como puede verse en la tabla, la representación en notación científica de los números reales es mucho más compacta cuando los números son muy grandes en magnitud o cuando son de magnitud muy pequeña (cercanos a cero); por eso, se usa mucho en ciencia, donde hay que manejar cifras enormes, como la masa del Sol, 1,98892 × $10^{30}$ kg, o muy pequeñas, como la carga del electrón, -1,602176487 × $10^{-19}$ culombios, y también por eso se usa, en forma de coma flotante, para la representación de números reales en la computadora.

### Representación en las computadoras y en las calculadoras

Para la entrada y el despliegue de números en notación científica, las computadoras y las calculadoras pueden representarlos de diferentes maneras. Por ejemplo, dependiendo del sistema, la velocidad de la luz, 2,99792458 x $10^8,$ puede representarse como sigue:

| Notación | Comentario |
| - | - |
| 2,99792458 x $10^8$ | Notación científica estándar usada en ciencia y tecnología. |
| 2,99792458e8 | Usada generalmente en las computadoras y en las calculadoras; a veces la "e" es mayúscula. |
| 2,99792458d8 | Usada en el lenguaje BASIC para representar números de doble precisión (15 dígitos significativos). Se usa la «e», como en el ejemplo anterior, para números de simple precisión (6 1/2 dígitos significativos). |
| 2,99792458 x $10^8$ | Usada en calculadoras. El exponente de 10 (la expresión x $10^8)$ se ingresa usando distintas teclas dependiendo de la calculadora, como $10^x$ o EXP |

## Sistema binario

Un valor real se puede extender con una cantidad arbitraria de dígitos. La coma flotante permite representar solo una cantidad limitada de dígitos de un número real; es decir, solo se trabajará con los dígitos más significativos (los de mayor peso) del número real, de tal manera que un número real generalmente no se podrá representar con total precisión sino como una aproximación que dependerá de la cantidad de dígitos significativos que tenga la representación en coma flotante con que se está trabajando. La limitación se halla cuando existen dígitos de peso menor al de los dígitos de la parte significativa. En este caso, estos suelen redondearse y, si son muy pequeños, se truncan. Sin embargo, y según el uso, la relevancia de esos datos puede ser despreciable, razón por la cual el método es interesante, pese a ser una potencial fuente de error.

En la representación binaria de coma flotante, el bit de mayor peso define el valor del signo (0 para positivo y 1 para negativo). Le siguen una serie de bits que definen el exponente. El resto de bits son la parte significativa.

Debido a que la parte significativa está generalmente normalizada, en estos casos el bit más significativo de la parte significativa siempre es 1, así que no se representa cuando se almacena sino que se asume implícitamente. Para poder realizar los cálculos, ese bit implícito se hace explícito antes de operar con el número en coma flotante. Hay otros casos donde el bit más significativo no es un 1, como en la representación del número cero, o cuando el número es muy pequeño en magnitud y rebasa la capacidad del exponente, en cuyo caso los dígitos significativos se representan de una manera denormalizada para no perder la precisión de un solo golpe sino progresivamente. En estos casos, el bit más significativo es cero y el número va perdiendo precisión poco a poco (mientras que al realizar cálculos este se haga más pequeño en magnitud) hasta que al final se convierte en cero.

### Ejemplo

En los próximos ejemplos se describe la notación de coma flotante. Abajo hay tres números en una representación de coma flotante de 16 bits. El bit de la izquierda es el signo, luego hay 6 bits para el exponente, seguidos de 9 bits para la parte significativa:

${\begin{matrix}{\text{Signo}}\\\overbrace {1} \\0\\0\end{matrix}}\quad {\begin{matrix}{\text{Exponente}}\\\overbrace {100011} \\011011\\101001\end{matrix}}\quad {\begin{matrix}{\text{Parte Significativa}}\\\overbrace {011101100} \\111001101\\000000001\end{matrix}}{\begin{matrix}\ \\\quad =\mathrm {0xC6EC} \\\quad =\mathrm {0x37CD} \\\ =\mathrm {0x5201} \end{matrix}}$

**Signo**

El bit de la izquierda expresa el sigma, con 0 indicando que el número es positivo y 1 indicando que el número es negativo. En los ejemplos de arriba, el primer número es negativo y los otros dos son positivos.

**Exponente**

El exponente indica cuánto se debe desplazar (hacia la derecha o hacia la izquierda) la coma binaria de la parte significativa. En este caso, el exponente ocupa 6 bits capaces de representar 64 valores diferentes; es decir, es un exponente binario (de base 2) que va desde -31 a +32 para representar potencias de 2 entre $2^{-31}$ y $2^{+32}$ e indica que la coma binaria se puede desplazar hasta 31 dígitos binarios hacia la izquierda (un número muy cercano a cero) y hasta 32 dígitos binarios hacia la derecha (un número muy grande).

Pero el exponente no se almacena como un número binario con signo (desde -31 hasta +32), sino como un entero positivo equivalente que va desde 0 hasta 63. Para ello, al exponente se le debe sumar un desplazamiento (bias) que, en este caso del exponente de 6 bits (64 valores), es de 31 (31 es la mitad de los 64 valores que se pueden representar, menos 1) y, al final, el rango del exponente de -31 a +32 queda representado internamente como un número entre 0 y 63, donde los números entre 31 y 63 representan los exponentes entre 0 y 32 y los números entre 0 y 30 representan los exponentes entre -31 y -1 respectivamente:

**Parte significativa**

La parte significativa, en este caso, está formada por 10 dígitos binarios significativos, de los cuales 9 son dígitos explícitos y 1 implícito que no se almacena.

Esta parte significativa generalmente está normalizada y tendrá siempre un 1 como el bit más significativo. Debido a que, salvo ciertas excepciones, el bit más significativo del significante siempre es 1, para ahorrar espacio y para aumentar la precisión en un bit, este bit no se almacena, y por ello se denomina bit oculto o implícito; sin embargo, antes de realizar los cálculos este bit implícito debe convertirse en un bit explícito.

**Números reales representados**

La notación genérica para la coma flotante descrita arriba representa respectivamente los siguientes números reales (expresados en binario). El color rojo indica el bit más significativo, que cuando se almacena es implícito (ver arriba la parte significativa en la representación de coma flotante), pero cuando se hacen los cálculos o cuando se muestra la información se vuelve explícito:

    $-\color {red}1\color {black},011101100\times 2^{4}=-\color {red}1\color {black}0111,01100$ (La coma se desplaza 4 posiciones binarias (bits) a la derecha)
    $\color {red}1\color {black},111001101\times 2^{-4}=0,000\color {red}1\color {black}111001101$ (La coma se desplaza 4 posiciones binarias a la izquierda)
    $\color {red}1\color {black},000000001\times 2^{10}=\color {red}1\color {black}0000000010,0$ (La coma se desplaza 10 posiciones binarias a la derecha)
       (con todos los valores expresados en representación binaria)

### Comparación con la coma fija

Para un tamaño determinado de bytes, la notación en coma flotante puede ser más lenta de procesar y es menos precisa que la notación en coma fija, ya que, además de almacenar el número (parte significativa), también debe almacenarse el exponente, pero permite un mayor rango en los números que se pueden representar.

### Coprocesador numérico y bibliotecas de coma flotante

Debido a que las operaciones aritméticas que se realizan con números en coma flotante son complejas, muchos sistemas destinan un procesador especial específico para este tipo de operaciones, denominado unidad de coma flotante, o tienen incorporados componentes especializados. En los casos donde no exista esta facilidad o el hardware de coma flotante no pueda realizar determinadas operaciones, se utilizan bibliotecas de software para realizar los cálculos.

## Formatos de coma flotante

Formatos binarios de los números en coma flotante del estándar IEEE 754 (2008).

| | Representación (número de bits) | Representación (número de bits) | Representación (número de bits) | Representación (número de bits) | Características | Características | Características | Características | Características |
| - | - | - | - | - | - | - | - | - | - |
| Tipo | Signo | Exponente | Significante | Total | Tamaño | Bits del exponente | Bits de precisión (nro. de bits significativos) | Dígitos significativos en decimal | Rango |
| Medio (half) | 1 | 5 | 10 | 16 | 2 bytes (16 bits) | 15 | 11 | 3,31 | -? .. 65504 |
| Simple (single) | 1 | 8 | 23 | 32 | 4 bytes (32 bits) | 127 | 24 | 7,22 | -1,701411733e38 .. 3,402823466e+38 |
| Doble (double) | 1 | 11 | 52 | 64 | 8 bytes (64 bits) | 1023 | 53 | 15,95 | 2,2250738585072014e-308 .. 1,7976931348623158e+308 |
| Cuádruple (quad) | 1 | 15 | 112 | 128 | 16 bytes (128 bits) | 16383 | 113 | 34,02 | ?? |
