online float convertidor floating-point binary ieee-754

floating point - float - ¿Por qué el último bit binario de 0.1f se redondea a 1?



ieee 754 double a decimal (4)

¿La computadora está redondeando el último bit en función de lo que sería el próximo bit cuando se usan los 23 bits de la mantisa?

Sí, por supuesto. De forma predeterminada, el compilador y el sistema aritmético de coma flotante intenta darle resultados redondeados correctamente.

Como analogía, si te pidiera que escribieras 2/3 a tres lugares decimales, ¿responderías con 0.666 o 0.667? Debería ser 0.667, porque está más cerca de la respuesta verdadera.

Estoy siguiendo un curso de sistema operativo en la universidad y recientemente aprendimos cómo los números de coma flotante están representados en la memoria.

Nuestra tarea consiste en convertir números flotantes ( float s) en representaciones binarias a mano.

por ejemplo, 200,0234375 daría 01000011010010000000011000000000 después del largo proceso de conversión.

Una de las preguntas es acerca de cómo se representaría 0.1f en la memoria. Entonces hice todo el proceso de conversión y terminé con esto:

00111101110011001100110011001100

Con lo que hemos aprendido hasta ahora, esta es la respuesta correcta a la pregunta (le pregunté a la maestra).

Pero, en la siguiente pregunta, se nos pide que verifiquemos la respuesta con un programa para ver la representación binaria real de 0.1f. La representación real es esta:

00111101110011001100110011001101

(Observe el último bit)

Luego se nos pide que intentemos adivinar por qué está sucediendo esto.

Observé el 0011 periódico mientras convertía el número y dado que el siguiente bit después de que el 0 final fuera un 1 , supondría que la computadora redondearía ese 0 final a 1 , lo que explicaría la diferencia.

Entonces, lo que quiero saber es, ¿estoy en lo correcto? ¿La computadora está redondeando el último bit en función de lo que sería el próximo bit cuando se usan los 23 bits de la mantisa?

Esta es una tarea, así que si pudiera simplemente guiarme hacia la respuesta, si me equivoco lo agradecería.

Además, no pude encontrar la respuesta a mi pregunta buscando en Google con las palabras clave que se me ocurrieron. Perdónenme si esto es un duplicado.


Esto dependerá de su plataforma, el hardware de coma flotante particular y las configuraciones particulares en ese hardware.

En particular, en las plataformas x86, el comportamiento particular dependerá del contenido de los registros de palabras de control FPU o SSE.


Hay varios modos de redondeo.

Puedes leer sobre esto en wikipedia .

Es solo una cuestión de implementación. C ++ no tiene un estándar para eso.


No estoy muy seguro de cómo guiarte sin solo dar la respuesta aquí, pero sí, estás en ello. El estándar IEEE incluye disposiciones específicas para este tipo de redondeo. Busca armas de guardia , redondas y pegajosas .