¿Qué rango de números se puede representar en un sistema IEEE-754 de 16, 32 y 64 bits?

76

Sé un poco sobre cómo se representan los números de punto flotante, pero me temo que no lo suficiente.

La pregunta general es:

Para una precisión dada (para mis propósitos, el número de lugares decimales exactos en base 10), ¿qué rango de números se puede representar para sistemas IEEE-754 de 16, 32 y 64 bits?

Específicamente, solo me interesa el rango de números de 16 bits y 32 bits con una precisión de +/- 0.5 (el lugar de las unidades) o +/- 0,0005 (el lugar de las milésimas).

Nate Parsons
fuente
1
@bendin existe incluso flotante de 8 bits o menos y, a menudo, se enseña en el plan de estudios de informática. También se utiliza en la codificación de instrucciones ARM . También existen flotantes de 10, 11, 14 bits
phuclv

Respuestas:

104

Para un número X de coma flotante IEEE-754 dado , si

2^E <= abs(X) < 2^(E+1)

entonces la distancia de X al siguiente número de punto flotante representable más grande ( épsilon ) es:

epsilon = 2^(E-52)    % For a 64-bit float (double precision)
epsilon = 2^(E-23)    % For a 32-bit float (single precision)
epsilon = 2^(E-10)    % For a 16-bit float (half precision)

Las ecuaciones anteriores nos permiten calcular lo siguiente:

  • Para media precisión ...

    Si desea una precisión de +/- 0.5 (o 2 ^ -1), el tamaño máximo que puede tener el número es 2 ^ 10. Cualquiera mayor que esto y la distancia entre números de coma flotante es mayor que 0.5.

    Si desea una precisión de +/- 0,0005 (aproximadamente 2 ^ -11), el tamaño máximo que puede tener el número es 1. Cualquier tamaño mayor que éste y la distancia entre números de coma flotante es mayor que 0,0005.

  • Para precisión simple ...

    Si desea una precisión de +/- 0.5 (o 2 ^ -1), el tamaño máximo que puede tener el número es 2 ^ 23. Cualquiera mayor que esto y la distancia entre números de coma flotante es mayor que 0.5.

    Si desea una precisión de +/- 0,0005 (aproximadamente 2 ^ -11), el tamaño máximo que puede tener el número es 2 ^ 13. Cualquiera mayor que esto y la distancia entre números de punto flotante es mayor que 0,0005.

  • Para doble precisión ...

    Si desea una precisión de +/- 0.5 (o 2 ^ -1), el tamaño máximo que puede tener el número es 2 ^ 52. Cualquiera mayor que esto y la distancia entre números de coma flotante es mayor que 0.5.

    Si desea una precisión de +/- 0,0005 (aproximadamente 2 ^ -11), el tamaño máximo que puede tener el número es 2 ^ 42. Cualquiera mayor que esto y la distancia entre números de punto flotante es mayor que 0,0005.

gnovice
fuente
3
En términos de metros, esto significa que, con una precisión de 1 my 1 mm respectivamente, la precisión media permite 1 km y 1 m, la precisión simple permite 8 Mm y 8 km, y la precisión doble permite 4Pm y 4Tm.
Aaron Franke
22

Para enteros de punto flotante (daré mi respuesta en términos de precisión doble IEEE), cada entero entre 1 y 2 ^ 53 es exactamente representable. Más allá de 2 ^ 53, los números enteros que son exactamente representables están separados por potencias crecientes de dos. Por ejemplo:

  • Cada segundo número entero entre 2 ^ 53 + 2 y 2 ^ 54 se puede representar exactamente.
  • Cada cuarto entero entre 2 ^ 54 + 4 y 2 ^ 55 se puede representar exactamente.
  • Cada octavo entero entre 2 ^ 55 + 8 y 2 ^ 56 se puede representar exactamente.
  • Cada dieciséis entero entre 2 ^ 56 + 16 y 2 ^ 57 se puede representar exactamente.
  • Cada 32º entero entre 2 ^ 57 + 32 y 2 ^ 58 se puede representar exactamente.
  • Cada 64º entero entre 2 ^ 58 + 64 y 2 ^ 59 se puede representar exactamente.
  • Cada 128º entero entre 2 ^ 59 + 128 y 2 ^ 60 se puede representar exactamente.
  • Cada 256o entero entre 2 ^ 60 + 256 y 2 ^ 61 se puede representar exactamente.
  • Cada número entero 512 entre 2 ^ 61 + 512 y 2 ^ 62 se puede representar exactamente. . . .

Los números enteros que no son exactamente representables se redondean al número entero representable más cercano, por lo que el redondeo del peor caso es 1/2 del espacio entre los números enteros representables.

Rick Regan
fuente
19

La precisión citada del enlace de Peter R a la referencia de MSDN es probablemente una buena regla general, pero, por supuesto, la realidad es más complicada.

El hecho de que el "punto" en "punto flotante" sea un punto binario y no un punto decimal tiene una forma de derrotar nuestras intuiciones. El ejemplo clásico es 0.1, que necesita una precisión de solo un dígito en decimal, pero no se puede representar exactamente en binario.

Si tiene un fin de semana para matar, eche un vistazo a Lo que todo científico informático debe saber sobre la aritmética de coma flotante . Probablemente le interesen especialmente las secciones sobre precisión y conversión de binario a decimal .

doblando
fuente
5

En primer lugar, ni IEEE-754-2008 ni -1985 tienen flotantes de 16 bits; pero es una adición propuesta con un exponente de 5 bits y una fracción de 10 bits. IEE-754 usa un bit de signo dedicado, por lo que el rango positivo y negativo es el mismo. Además, la fracción tiene un 1 implícito al frente, por lo que obtienes un bit extra.

Si desea precisión en el lugar de las unidades, ya que puede representar cada número entero, la respuesta es bastante simple: el exponente desplaza el punto decimal al extremo derecho de la fracción. Entonces, una fracción de 10 bits le da ± 2 11 .

Si desea un bit después del punto decimal, cede un bit antes, por lo que tiene ± 2 10 .

La precisión simple tiene una fracción de 23 bits, por lo que tendría ± 2 24 enteros.

La cantidad de bits de precisión que necesita después del punto decimal depende completamente de los cálculos que esté haciendo y de cuántos esté haciendo.

  • 2 10 = 1.024
  • 2 11 = 2.048
  • 2 23 = 8,388,608
  • 2 24 = 16.777.216
  • 2 53 = 9,007,199,254,740,992 (doble precisión)
  • 2 113 = 10,384,593,717,069,655,257,060,992,658,440,192 (quad-precisión)

Ver también

derobert
fuente
2

Consulte IEEE 754-1985 :

v = (-1) ^ signo * s ^ (exponente-exponente_bios) * (1 + fracción)

Nota (1 + fracción). Como señala @bendin , al usar un punto flotante binario, no puede expresar valores decimales simples como 0.1. La implicación es que puede introducir errores de redondeo haciendo sumas simples muchas veces o llamando a cosas como truncamiento. Si está interesado en algún tipo de precisión, la única forma de lograrlo es usar un decimal de punto fijo, que básicamente es un entero escalado.

Eugene Yokota
fuente
0

Si entiendo tu pregunta correctamente, depende de tu idioma.
Para C #, consulte la referencia de MSDN . Float tiene una precisión de 7 dígitos y una precisión de 15-16 dígitos.

Peter R
fuente
7
En realidad, IEEE-754 define la precisión, por lo que no debería ser específico del idioma.
derobert
0

Me tomó bastante tiempo darme cuenta de que al usar dobles en Java, no estaba perdiendo una precisión significativa en los cálculos. El punto flotante en realidad tiene una muy buena capacidad para representar números con una precisión bastante razonable. La precisión que estaba perdiendo fue inmediatamente al convertir los números decimales escritos por los usuarios a la representación de punto flotante binario que es compatible de forma nativa. Recientemente comencé a convertir todos mis números a BigDecimal. BigDecimal es mucho más complicado de manejar en el código que los flotantes o los dobles, ya que no es uno de los tipos primitivos. Pero, por otro lado, podré representar exactamente los números que escriben los usuarios.

PanCrit
fuente