Primeros pasos con el punto flotante

Visión general

¿Qué es el punto flotante?

Hay dos tipos de números:

  • punto fijo donde un cierto número de dígitos están disponibles antes y después del punto base.
  • punto flotante donde un cierto número de dígitos están disponibles para la mantisa y para el exponente.

Un ejemplo usando dígitos decimales con tres lugares decimales antes del punto decimal y dos lugares decimales después del lugar decimal:

  • 0 se representaría como 000.00
  • 0,123 se representaría como 000,12
  • 0,00123 se representaría como 000,00
  • 1 se representaría como 001.00
  • 1.123 se representaría como 001.12
  • 1,00123 se representaría como 001,00
  • 123.456 se representaría como 123.45
  • 1234.56 es un error porque se almacenaría como 234.56 y eso es simplemente incorrecto

Un ejemplo usando dígitos decimales con cinco lugares decimales para la mantisa y un lugar decimal para el exponente:

  • 0 podría representarse como .00000 x 10^0
  • 0.1 podría representarse como .10000 x 10^0
  • 0.0000123456 podría representarse como .12345 x 10^-4
  • 0.000000000123456 podría representarse como .12345 x 10^-9
  • 0.00000000001 es un error porque el exponente no es lo suficientemente grande para almacenar el número
  • 1 podría representarse como .10000 x 10^1
  • 1.123 podría representarse como .11230 x 10^1
  • 1.00123 podría representarse como .10012 x 10^1
  • 123.45678 podría representarse como .12345 x 10^2
  • 123456789.1 podría representarse como .12345 x 10^9
  • 1000000000 es un error porque el exponente no es lo suficientemente grande para almacenar el número

Entonces, un número de punto flotante puede representar números con magnitudes muy diferentes (0.000000000123456 y 123456789.1) con la misma precisión relativa.

Los números de punto fijo son útiles cuando siempre se necesita un número particular de lugares decimales, independientemente de la magnitud del número (dinero, por ejemplo). Los números de punto flotante son útiles cuando la magnitud varía y aún se necesita precisión. Por ejemplo: para un ingeniero de carreteras, las distancias se miden en metros y 0,01 de un metro es insignificante, pero para un diseñador de microchips, la diferencia entre 0,0000001 metros y 0,000000001 metros es enorme, y un físico puede necesitar usar números enormes y muy, muy pequeños números en el mismo cálculo. La precisión en muchas magnitudes diferentes es lo que hace que los números de coma flotante sean útiles.

Cómo funciona

Las computadoras no usan decimales, usan binarios y eso causa problemas para el punto flotante porque no todos los números decimales se pueden representar exactamente con un número de punto flotante y eso introduce errores de redondeo en los cálculos.

Habiendo hecho todos los ejemplos en decimal, es importante tener en cuenta que debido a que son binarios, en lugar de almacenar un número de coma flotante como una suma de fracciones decimales:

123.875 = 1/10^-2 + 2/10^-1 + 3/10^0 + 8/10^1 + 7/10^2 + 5/10^3

las computadoras almacenan números de coma flotante como una suma de fracciones binarias:

123.875 = 1/2^-6 + 1/2^-5 + 1/2^-4 + 1/2^-3 + 1/2^-1 + 1/2^0 + 1/2^1 + 1/2^2 + 1/2^3

Hay muchas formas diferentes de almacenar patrones de bits que representan esas fracciones, pero la que usan la mayoría de las computadoras ahora se basa en el estándar IEEE-754. Tiene reglas para almacenar representaciones decimales y binarias y para tipos de datos de diferentes tamaños.

La forma en que se almacenan los números normales usando el estándar IEEE es:

  • un bit para el signo - almacenado en el MSB, 1 significa negativo y 0 significa positivo
  • algunos bits para el exponente - el sesgo se resta para obtener exponentes positivos y negativos
  • algunos bits para la mantisa - dígitos después del lugar decimal con un 1 implícito antes del lugar decimal.

Para permitir un subdesbordamiento más gradual, los números desnormalizados (cuando los bits del exponente son todos cero) se tratan de manera especial: el exponente se establece en -126 y el 1 implícito inicial antes del lugar decimal NO se agrega a la mantisa.

Números de punto flotante IEEE-754 de 32 bits

Para un número normal de punto flotante IEEE-754 de 32 bits:

  • el bit 32 es el signo
  • los bits 24-31 son el exponente - el sesgo es 127
  • los bits 1-23 son la mantisa

Entonces un número normal se calcula como:

-1^sign * 2^(exponent-bias) * 1.mantissa

Si el patrón de bits fuera:

0 10000101 11101111100000000000000

Entonces el valor es:

-1^0 * 2^(133-127) * 1.111011111
-1^0 *     2^6     * (1 + 1/2 + 1/4 + 1/8 + 1/32 + 1/64 + 1/128 + 1/256 + 1/512)
   1 *      64     * 991/512
         123.875

Hay algunos valores especiales:

0 11111111 11111111111111111111111 = NaN
0 11111111 00000000000000000000000 = +infinity
1 11111111 00000000000000000000000 = -infinity
0 00000000 00000000000000000000000 = +Zero
1 00000000 00000000000000000000000 = -Zero

Los detalles del formato IEEE-754 de 32 bits se pueden encontrar en:

  • http://punto-flotante-gui.de/formats/fp
  • https://en.wikipedia.org/wiki/Single-precision_floating-point_format
  • https://en.wikipedia.org/wiki/IEEE_punto_flotante