Cuando se representa como un flotante, su número tiene un exponente de 16 (es decir, el valor es su mantisse multiplicado por 2^16 o 65536). El Mantisse se convierte entonces en
123456.123456/65536 = 1.8837909462890625
el fin de encajar en un flotador 32 bits, el Mantisse se trunca a 23 bits, por lo que ahora se convierte en 1.883791
. Cuando se multiplica por 65536
, se convierte en 123456.125
.
Observe el 5
en la tercera posición después del punto decimal: la rutina de salida de C++ que utilizó lo redondea, haciendo que su número final se vea como 123456.13
.
EDITAR Explicación del redondeo: (comentario de Rick Regan)
El redondeo se produce primero en binario (24 bits), en decimal a la conversión binaria, y luego a decimal, en printf
. El valor almacenado es 1.1110001001000000001 x 2^16 = 1.8837909698486328125 x 2^16 = 123456.125. Se imprime como 123456.13, pero solo porque Visual C++ utiliza el redondeo "redondeado a la mitad de cero".
Rick tiene un outstanding article on the subject, también.
Si desea jugar con otros números y sus representaciones de flotación, aquí hay un very useful IEEE-754 calculator.
gracias a todos por las respuestas. lo entiendo ahora. solo pensé que debería soltar dígitos sobredimensionados después del punto, en lugar de redondearlo. – Kosmos