Pregunta

Yo sé un poco acerca de cómo se representan los números en 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 decimales exactos en base 10), qué rango de números pueden ser representados por 16, 32 y sistemas de 64 bits IEEE-754?

Específicamente, estoy sólo está interesado en el rango de números de 16 bits y de 32 bits precisión de +/- 0,5 (el lugar de las unidades) o +/- 0,0005 (el lugar milésimas).

¿Fue útil?

Solución

Para una href="http://en.wikipedia.org/wiki/IEEE_754" rel="nofollow noreferrer"> 754 IEEE-número dado punto flotante X Si

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

entonces la distancia desde X a la siguiente mayor número de coma flotante representable ( epsilon) 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 el siguiente:

  • En medio de precisión ...

    Si desea una precisión de +/- 0,5 (o 2 ^ -1), el tamaño máximo que el número puede ser es 2 ^ 10. Cualquier mayor que este y la distancia entre números de punto flotante es mayor que 0,5.

    Si desea una precisión de +/- 0,0005 (alrededor de 2 ^ -11), el tamaño máximo que el número puede ser: 1. mayor que este, y la distancia entre los números de punto flotante es mayor que 0,0005.

  • En precisión simple ...

    Si desea una precisión de +/- 0,5 (o 2 ^ -1), el tamaño máximo que el número puede ser es 2 ^ 23. Cualquier mayor que este y la distancia entre números de punto flotante es mayor que 0,5.

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

  • En doble precisión ...

    Si desea una precisión de +/- 0,5 (o 2 ^ -1), el tamaño máximo que el número puede ser es 2 ^ 52. Cualquier mayor que este y la distancia entre números de punto flotante es mayor que 0,5.

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

Otros consejos

Para enteros de punto flotante (Voy a dar mi respuesta en términos de IEEE con precisión doble), cada número entero entre 1 y 2 ^ 53 es exactamente representable. Más allá de 2 ^ 53, números enteros que son exactamente representable están separados entre sí mediante el aumento de las potencias de dos. Por ejemplo:

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

enteros que no son exactamente representable se redondean al número entero más cercano representable, por lo que el peor de los casos de redondeo se media la separación entre números enteros representables.

La precisión citado enlace de formulario de Peter R a que el árbitro MSDN es probablemente una buena regla de oro, pero, por supuesto, la realidad es más complicada.

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

Si usted tiene un fin de semana para matar, echar un vistazo a Lo que todo informático debe saber sobre la aritmética de punto flotante . Es probable que sea particularmente interesado en las secciones sobre precisión y binario a decimal Conversión .

En primer lugar, ni IEEE-754-2008 -1985 ni tienen 16 bits flota; pero es una adición propuesta con un exponente de 5 bits y la fracción de 10 bits. IEE-754 utiliza un bit de signo dedicado, por lo que el rango positivo y negativo es el mismo. Además, la fracción tiene una implícita 1 delante, para que pueda obtener un poco más.

Si desea una precisión a la posición de las unidades, como en que puede representar cada número entero, la respuesta es bastante simple: El exponente se desplaza el punto decimal a la derecha de extremo de la fracción. Por lo tanto, una fracción de 10 bits se obtiene ± 2 11 .

Si quieres uno poco después del punto decimal, que renunciar a uno poco antes de ella, por lo que tiene ± 2 10 .

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

¿Cuántos bits de precisión que necesita después del punto decimal depende por completo de los cálculos que están haciendo, y cuántos se están haciendo.

  • 2 10 = 1024
  • 2 11 = 2048
  • 2 23 = 8388608
  • 2 24 = 16777216
  • 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

IEEE 754-1985 :

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

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

Si entiendo bien su pregunta, depende de su idioma.
Para C #, echa un vistazo a MSDN ref . Flotador tiene una precisión de 7 dígitos y precisión doble 15-16 dígitos.

Me tomó bastante tiempo para darse cuenta de que cuando se utiliza dobles en Java, que no estaba perdiendo precisión significativa en los cálculos. punto flotante en realidad tiene una muy buena capacidad de representar los números de precisión bastante razonable. La precisión que estaba perdiendo era inmediatamente después de la conversión de decimal números escritos por los usuarios a la representación binaria coma flotante que es compatible de forma nativa. Recientemente he comenzado a convertir todos mis números de BigDecimal. BigDecimal es mucho más trabajo que hacer frente en el código de flotadores o dobles, ya que no es uno de los tipos primitivos. Pero, por otro lado, voy a ser capaz de representar exactamente los números que los usuarios escriben en.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top