Duplicar posibles:
Which is the first integer that an IEEE 754 float is incapable of representing exactly?Encontrar el número entero más pequeño que no puede ser representado como un 754 IEEE-flotante de 32 bits
En primer lugar, esta es una pregunta tarea, sólo para aclarar este de inmediato. No estoy buscando una solución alimentada con cuchara, por supuesto, tal vez un pequeño puntero en la dirección correcta.
lo tanto, mi tarea es encontrar el número entero positivo más pequeño que no puede ser representado como un flotador de IEEE-754 (32 bits). Yo sé que las pruebas de la igualdad en algo como "== 5 5.00000000001" fallará, así que pensé que había simplemente un bucle sobre todos los números y la prueba para que de esta manera:
int main(int argc, char **argv)
{
unsigned int i; /* Loop counter. No need to inizialize here. */
/* Header output */
printf("IEEE floating point rounding failure detection\n\n");
/* Main program processing */
/* Loop over every integer number */
for (i = 0;; ++i)
{
float result = (float)i;
/* TODO: Break condition for integer wrapping */
/* Test integer representation against the IEEE-754 representation */
if (result != i)
break; /* Break the loop here */
}
/* Result output */
printf("The smallest integer that can not be precisely represented as IEEE-754"
" is:\n\t%d", i);
return 0;
}
Esto fracasó. Luego traté de restar el entero "i" del punto flotante "resultado" que está "yo" esperando lograr algo así como "0.000000002" que pude probar y detectar, que también falló.
Puede alguien señalar una propiedad de los puntos que puedo confiar para obtener la condición de corte deseada flotante?
-------------------- --------------- Actualizar continuación
Gracias por la ayuda en este ¡uno! Aprendí varias cosas aquí:
Mi idea original era de hecho correcta y determinado el resultado en la máquina que estaba destinado a ser ejecutado en (Solaris 10, 32 bits), pero no funcionó en mis sistemas Linux (64 bit y 32 bit).
Los cambios que se añaden hizo Hans Passant el programa también funciona con mis sistemas, parece que hay algunas diferencias de plataforma pasando aquí que no me esperaba,
Gracias a todos!
¿Cómo falla? Cuando compilo y ejecuto su código, el resultado es 16777217. – Henrik
@KennyTM: Maldición, ¡y pensé que era bueno para buscar! Perdón por duplicar entonces. – LukeN
@Henrik: Simplemente siguió retrocediendo (INT_MAX -> 0) y nunca se rompió con un resultado. – LukeN