Как эффективно возвести 2 в дробную степень в C++? ⇐ C++
Как эффективно возвести 2 в дробную степень в C++?
Я хочу эффективно возвести два числа в рациональную степень. Это будет основой всех моих других реализаций математических функций (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
Я хочу эффективно возвести два числа в рациональную степень. Это будет основой всех моих других реализаций математических функций (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
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Каков самый быстрый способ возвести в степень два массивных числа в Python?
Anonymous » » в форуме Python - 0 Ответы
- 17 Просмотры
-
Последнее сообщение Anonymous
-