Я хотел бы знать, как работает число чисел с плавающей запятой. Как я могу суммировать два двойных (или плавающих) числа с помощью побитовых операций?
Короткий ответ: если вам нужно спросить, вы не собираетесь внедрять с плавающей запятой из побитовых операторов. Это вполне возможно, но есть несколько тонких точек, о которых вам нужно было бы спросить раньше. Вы можете начать с реализации функции преобразования double → float, это проще, но познакомит вас со многими концепциями. Вы также можете сделать double → ближайшее целое как упражнение.
Тем не менее, вот наивная версия добавления:
Используйте большие массивы бит для каждого из двух операндов (254 + 23 для float
, 2046 + 52 для double
). Поместите значение в нужном месте в массиве в соответствии с показателем. Предполагая, что аргументы оба нормализованы, не забудьте поставить неявное начало 1. Добавьте два массива бит с обычными правилами двоичного добавления. Затем преобразуйте полученный массив в формат с плавающей запятой: сначала найдите самый левый 1; положение этого левого 1 определяет экспонента. Значимость результата начинается сразу после этого ведущего 1 и соответственно 23- или 52-битного. После этого биты определяют, должно ли значение быть округлено вверх или вниз.
Хотя это наивная версия, это уже довольно сложно.
Не наивная версия не использует массивы шириной 2100 бит, но вместо этого использует пару "защитных бит" (см. Раздел "Округление" в этом документе).
Дополнительные тонкости включают: