При представлении в виде числа с плавающей точкой показатель степени вашего числа равен 16 (т. Е. Значение равно его времени богомола 2 ^ 16, или 65536).Тогда мантисса становится
123456.123456 / 65536 = 1.8837909462890625
Для того, чтобы поместиться в 32-битное число с плавающей запятой, мантисса усекается до 23 бит, поэтому теперь она становится 1.883791
.При умножении обратно на 65536
оно становится 123456.125
.
Обратите внимание на 5
в третьей позиции после десятичной запятой: используемая вами процедура вывода C ++ округляет ее, делая ваше окончательное числовыглядеть как 123456.13
.
РЕДАКТИРОВАТЬ Объяснение округления: (комментарий Рика Регана)
округление происходит сначала в двоичном (до 24 бит), в десятичном виде додвоичное преобразование, а затем в десятичное, в printf
.Сохраненное значение составляет 1,1110001001000000001 x 2 ^ 16 = 1,8837909698486328125 x 2 ^ 16 = 123456,125.Он печатается как 123456.13, но только потому, что Visual C ++ использует округление «до половины от нуля».
У Рика есть выдающаяся статья по теме , тоже.
ЕслиВы хотели бы поиграть с другими числами и их представлениями с плавающей точкой, вот очень полезный калькулятор IEEE-754 *1025*.