valor suma que punto normalizada norma mantisa informatica flotante exponente con coma aritmetica floating-point precision numerical ieee-754

floating-point - que - suma en punto flotante



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

En primer lugar, ni IEEE-754-2008 ni -1985 tienen flotadores 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 implícito 1 en frente, por lo que obtienes un poco más.

Si quiere precisión en el lugar de las unidades, como 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 te da ± 2 11 .

Si quiere 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 (precisión doble)
  • 2 113 = 10,384,593,717,069,655,257,060,992,658,440,192 (precisión cuádruple)

Ver también

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

La pregunta general es:

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

Específicamente, solo estoy interesado en el rango de números de 16 bits y 32 bits con precisión de +/- 0.5 (el de las unidades) o +/- 0.0005 (el lugar de las milésimas).


Estoy extrayendo esta respuesta de la documentación de MATLAB para la función EPS , pero debe aplicarse universalmente a los números de punto flotante IEEE-754 .

Para un punto flotante dado número X , si

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

entonces la distancia desde X hasta el siguiente número más grande de punto flotante ( é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 la mitad de 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. Cualquier más grande que este y la distancia entre números de coma flotante es mayor que 0.5.

    Si desea una precisión de +/- 0.0005 (alrededor de 2 ^ -11), el tamaño máximo que puede tener el número es 1. Cualquiera más grande que este y la distancia entre los números de punto 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. Cualquier más grande que este y la distancia entre números de coma flotante es mayor que 0.5.

    Si desea una precisión de +/- 0.0005 (alrededor de 2 ^ -11), el tamaño máximo que puede tener el número es 2 ^ 13. Cualquier más grande que este y la distancia entre números de coma 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. Cualquier más grande que este y la distancia entre números de coma flotante es mayor que 0.5.

    Si desea una precisión de +/- 0.0005 (alrededor de 2 ^ -11), el tamaño máximo que puede tener el número es 2 ^ 42. Cualquier más grande que este y la distancia entre números de coma flotante es mayor que 0.0005.


La precisión 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 es representable exactamente en binario.

Si tiene un fin de semana para matar, eche un vistazo a Lo que todo científico informático debería saber sobre la aritmética de coma flotante . Probablemente estarás particularmente interesado en las secciones Precision y Conversión de Binario a Decimal .


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


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

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

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


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


Ver IEEE 754-1985 :

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