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).
floating-point
precision
numerical
ieee-754
Nate Parsons
fuente
fuente
Respuestas:
Para un número X de coma flotante IEEE-754 dado , si
entonces la distancia de X al siguiente número de punto flotante representable más grande ( épsilon ) es:
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.
fuente
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:
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.
fuente
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 .
fuente
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.
Ver también
fuente
Consulte IEEE 754-1985 :
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.
fuente
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.
fuente
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.
fuente