3 votos

Punto flotante: entender su inexactitud

Estoy tratando de entender por qué un punto flotante es inexacto. Por favor, tenga en cuenta que no soy un matemático.

¿Cuál es exactamente la diferencia entre los enteros flotantes y los enteros dobles? y ¿por qué utilizar uno en lugar de otro?

Gracias por las respuestas "fáciles de entender",

Robert

9voto

hernan43 Puntos 566

La diferencia entre float4 (flotador de 32 bits) y float8 (flotador de 64 bits, o de doble precisión) depende del contexto de lo que se almacena y de cómo se va a utilizar. Para muchas aplicaciones, float4 es suficiente, pero los SIG tienen exigencias particulares de precisión de almacenamiento adicional.

Considere la posibilidad de almacenar coordenadas UTM con precisión milimétrica. Puede tener un Northing de 4833438.204 medido con un equipo de encuesta elegante. Almacenado como float4, el número se trunca en 4833438 , perdiendo los milímetros. Si se almacena como float8, se conservan los dígitos adicionales (hasta la escala de picómetros). La razón por la que el almacenamiento de coordenadas UTM es un reto, requiriendo un almacenamiento de doble precisión, es que suelen ser del orden de cientos de miles a millones en la escala.

5voto

rkthkr Puntos 6651

En StackOverflow también se ha hecho esta pregunta (el lugar más obvio para ello). Aunque la pregunta es específica de C#, las respuestas son válidas para todos los casos:

¿Cuál es la diferencia entre Decimal, Float y Double en C#?

4voto

pufferfish Puntos 679

Wikipedia tiene una buena discusión sobre esto: http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems

0voto

Dan Puntos 593

La mejor manera de visualizar cómo los números de punto flotante son inexactos es pensar en términos de valores de "punto flotante" de base 10. Se pueden utilizar hasta diez dígitos consecutivos distintos de cero y colocar el punto decimal de forma arbitraria. Ejemplos:

1234567890     // nine digits, decimal point placed to multiply 123456789 with 10
2345678901     // ten digits
12345.6789     // nine digits, decimal point placed to divide by 10000.
0.000000123456789  // nine digits, divide by 10000000

El resultado de cada operación debe encajar en el mismo esquema:

  1234567890
+          0.000000123456789    // two legal inputs
= 1234567890.000000123456789    // give an unrepresentable output
= 1234567890                    // which loses the least significant digits
- 1234567890                    // subtract one of the numbers again
=          0                    // the digits are lost forever

Básicamente, se pueden representar años luz y milímetros, pero si se añade un milímetro a un año luz se obtiene un año luz. Si necesitas más precisión, utilizarías un entero lo suficientemente grande como para poder representar un año luz en milímetros.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X