Как эффективно возвести 2 в дробную степень в C++?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как эффективно возвести 2 в дробную степень в C++?

Сообщение Anonymous »


Я хочу эффективно возвести два числа в рациональную степень. Это будет основой всех моих других реализаций математических функций (log, log2, exp, sin, cos), поскольку я использую метод Ньютона, а многие итерационные схемы включают возведение в степень.

Я хочу реализовывать методы быстрее, чем cmath. Поскольку мы используем двоичные компьютеры, многие вещи, связанные с числом два, можно взломать.

В формате с плавающей запятой одинарной точности для представления дробей используются 32 бита, первый бит — это знаковый бит, следующие 8 бит — это показатель степени со смещением 127, а следующие 24 бита кодируют дробь. Для двойной точности показатель степени кодируется как 11 бит со смещением 1023, а мантисса равна 52 битам.

Моя идея проста: я использую степенное правило умножения, в данном случае 2a * 2b = 2a + b . Для дробного показателя e его десятичная часть d равна e % 1, а затем целая часть равна i = e - d. Поскольку способ кодирования чисел с плавающей запятой позволяет нам просто собрать окончательное представление с плавающей запятой, объединив две части: экспоненту и мантиссу. i с его смещением переходит прямо в показательную часть.

С мантиссой немного сложнее, но есть лайфхаки. Мантисса кодируется как двоичное дробное число с неявной целой частью единицы. Мы можем просто добавить единицу к d, чтобы получить двоичную дробь из битов с плавающей запятой. Обратите внимание: если d отрицательное значение, его следует прибавить к двум, а не к одному.

Следующие шаги будут простыми: первый бит соответствует 2-1, второй 2-2, третий 2-3 и т. д. и так далее. Важно то, что они являются константами, поэтому их можно хранить в справочной таблице. Итак, для получения дробной степени найдите установленные биты мантиссы и умножьте число, инициализированное единицей, на соответствующее значение в справочной таблице.

Это дает мантиссу окончательного значения. Вычтите единицу и умножьте разницу на 1
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как эффективно возвести 2 в дробную степень в C++?
    Anonymous » » в форуме C++
    0 Ответы
    33 Просмотры
    Последнее сообщение Anonymous
  • Почему я не могу возвести в отрицательную степень в numpy?
    Anonymous » » в форуме Python
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Каков самый быстрый способ возвести в степень два массивных числа в Python?
    Anonymous » » в форуме Python
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Правильный способ получить дробную часть, двойную, как int
    Anonymous » » в форуме C#
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Как вернуть дробную часть числа? [закрыто]
    Anonymous » » в форуме Python
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»