c++ - programacion - ¿Qué es un ejemplo simple de error de punto flotante/redondeo?
punto flotante ejemplos (5)
Aquí hay uno que me atrapó.
round(256.49999) == 256
roundf(256.49999) == 257
dobles y flotadores ..
He oído hablar de "error" al usar variables de coma flotante. Ahora estoy tratando de resolver este rompecabezas y creo que estoy obteniendo un error de redondeo / punto flotante. Así que finalmente voy a descubrir los conceptos básicos del error de coma flotante.
¿Qué es un ejemplo simple de error de coma flotante / redondeo (preferiblemente en C ++)?
Editar: por ejemplo, decir que tengo un evento que tiene probabilidad p de tener éxito. Hago este evento 10 veces (p no cambia y todas las pruebas son independientes). ¿Cuál es la probabilidad de exactamente 2 pruebas exitosas? Tengo esto codificado como:
double p_2x_success = pow(1-p, (double)8) * pow(p, (double)2) * (double)choose(8, 2);
¿Es esta una oportunidad para un error de coma flotante?
En general, el error de punto flotante se refiere a cuando un número que no se puede almacenar en la representación de punto flotante IEEE.
Los enteros se almacenan con el bit del extremo derecho siendo 1, y cada bit a la izquierda siendo el doble (2,4,8, ...). Es fácil ver que esto puede almacenar cualquier número entero hasta 2 ^ n, donde n es el número de bits.
La mantisa (parte decimal) de un número de coma flotante se almacena de una manera similar, pero moviéndose de izquierda a derecha, y cada bit sucesivo es la mitad del valor de la anterior. (En realidad es un poco más complicado que esto, pero lo hará por ahora).
Por lo tanto, los números como 0.5 (1/2) son fáciles de almacenar, pero no todos los números <1 se pueden crear agregando un número fijo de fracciones de la forma 1/2, 1/4, 1/8, ...
Un ejemplo realmente simple es 0.1 o 1/10. Esto se puede hacer con una serie infinita (que en realidad no me molesto hacer ejercicio), pero cada vez que una computadora almacena 0.1, no se almacena exactamente este número.
Si tiene acceso a una máquina Unix, es fácil ver esto:
Python 2.5.1 (r251:54863, Apr 15 2008, 22:57:26)
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 0.1
0.10000000000000001
>>>
Deberá tener mucho cuidado con las pruebas de igualdad con flotadores y dobles, en el idioma en el que se encuentre.
(En cuanto a su ejemplo, 0.2 es otro de esos números molestos que no pueden almacenarse en IEEE binario, pero siempre que esté probando desigualdades, en lugar de igualdades, como p <= 0.2, entonces estará bien).
La imagen vale más que mil palabras: intente dibujar la ecuación f(k)
:
y obtendrás un gráfico XY (X e Y están en escala logarítmica).
Si la computadora pudiera representar flotadores de 32 bits sin error de redondeo, por cada k
deberíamos obtener cero. Pero en su lugar el error aumenta con valores mayores de k debido a la acumulación de error de punto flotante.
hth!
Una simple C que me atrapó hace un tiempo,
char *c = "90.1000";
double d = 0;
sscanf(c,"%f",&d);
printf("%0.4f",d);
>> 90.0999
Esto fue en una función que convirtió ángulos en DMS a radianes, lo que no sucedió en el caso anterior.
for(double d = 0; d != 0.3; d += 0.1); // never terminates