Как выполнить сумму между двойными и побитовыми операциями

0

Я хотел бы знать, как работает число чисел с плавающей запятой. Как я могу суммировать два двойных (или плавающих) числа с помощью побитовых операций?

  • 3
    Знаете ли вы, как представлены числа с плавающей запятой, например, IEEE-754?
  • 0
    Посмотрите на: stackoverflow.com/questions/4743115/…
Показать ещё 3 комментария
Теги:
floating-point
bit-manipulation
bitwise-operators

1 ответ

8

Короткий ответ: если вам нужно спросить, вы не собираетесь внедрять с плавающей запятой из побитовых операторов. Это вполне возможно, но есть несколько тонких точек, о которых вам нужно было бы спросить раньше. Вы можете начать с реализации функции преобразования double → float, это проще, но познакомит вас со многими концепциями. Вы также можете сделать double → ближайшее целое как упражнение.

Тем не менее, вот наивная версия добавления:

Используйте большие массивы бит для каждого из двух операндов (254 + 23 для float, 2046 + 52 для double). Поместите значение в нужном месте в массиве в соответствии с показателем. Предполагая, что аргументы оба нормализованы, не забудьте поставить неявное начало 1. Добавьте два массива бит с обычными правилами двоичного добавления. Затем преобразуйте полученный массив в формат с плавающей запятой: сначала найдите самый левый 1; положение этого левого 1 определяет экспонента. Значимость результата начинается сразу после этого ведущего 1 и соответственно 23- или 52-битного. После этого биты определяют, должно ли значение быть округлено вверх или вниз.

Хотя это наивная версия, это уже довольно сложно.

Не наивная версия не использует массивы шириной 2100 бит, но вместо этого использует пару "защитных бит" (см. Раздел "Округление" в этом документе).

Дополнительные тонкости включают:

  • Знаковые биты аргументов могут означать, что величины должны быть вычтены для сложения или добавлены для вычитания.
  • Одним из аргументов может быть NaN. Тогда результатом будет NaN.
  • Одним из аргументов может быть бесконечность. Если другой аргумент является конечным или такой же бесконечностью, результат будет такой же бесконечностью. В противном случае результатом будет NaN.
  • Одним из аргументов может быть денормализованное число. В этом случае нет ведущего 1 при передаче номера в массив бит для сложения.
  • Результат добавления может быть бесконечным: в зависимости от деталей реализации это будет признано слишком большим, чтобы соответствовать формату, или переполнением во время добавления двоичных массивов (переполнение может также возникать во время округление).
  • Результатом добавления может быть денормализованное число. Это признается отсутствием ведущего 1 в первых 2046 битах массива бит. В этом случае последние 52 бита массива должны быть переданы значению результата, а показатель должен быть установлен на ноль, чтобы указать денормализованный результат.
  • 0
    +1 за "если вам нужно спросить". Это один из тех вопросов, где ответ для людей, которые спрашивают, отличается.
  • 0
    @ gnasher729 В течение 3 минут я задавался вопросом, хочу ли я закрыть слово «слишком широко» или ответить, и я начал отвечать только потому, что не понимал, насколько сложным окажется даже простой метод. Тем не менее, было бы хорошим вопросом, если бы он был от кого-то, кто начал, и кто был смущен одной из многих трудностей.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню