Быстрое умножение / деление на 2 для чисел с плавающей точкой и двойных чисел (C / C ++)

В программном обеспечении, которое я пишу, я делаю миллионы умножения или деления на 2 (или степени 2) моих значений. Мне бы очень хотелось, чтобы эти значения былиint чтобы я мог получить доступ к операторам bithift

int a = 1;
int b = a<<24

Тем не менее, я не могу, и я должен придерживаться двойников.

Мой вопрос:поскольку есть стандартное представление двойных чисел (знак, экспонента, мантисса), есть ли способ играть с показателем степени, чтобы получить быстрое умножение / деление на степень 2?

Я даже могу предположить, что число бит будет фиксированным (программное обеспечение будет работать на машинах, которые всегда будут иметь двойные 64-битные числа)

П.С .: И да, алгоритм в основном выполняет только эти операции. Это узкое место (оно уже многопоточное).

Изменить: Или я полностью ошибаюсь, и умные компиляторы уже оптимизируют вещи для меня?

Временные результаты (с помощью Qt для измерения времени, перебор, но мне все равно):

#include <QtCore/QCoreApplication>
#include <QtCore/QElapsedTimer>
#include <QtCore/QDebug>

#include <iostream>
#include <math.h>

using namespace std;

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

while(true)
{
    QElapsedTimer timer;
    timer.start();

    int n=100000000;
    volatile double d=12.4;
    volatile double D;
    for(unsigned int i=0; i<n; ++i)
    {
        //D = d*32;      // 200 ms
        //D = d*(1<<5);  // 200 ms
        D = ldexp (d,5); // 6000 ms
    }

    qDebug() << "The operation took" << timer.elapsed() << "milliseconds";
}

return a.exec();
}

Прогоны предполагают, чтоD = d*(1<<5); а такжеD = d*32; работать в одно и то же время (200 мс), тогда какD = ldexp (d,5); намного медленнее (6000 мс). язнать что это микро-эталон, и что внезапно моя оперативная память взорвалась, потому что Chrome внезапно просил вычислять Pi в моей спине каждый раз, когда я запускаюldexp()так что этот тест ничего не стоит. Но я все равно буду держать это.

С другой стороны, у меня возникли проблемы с выполнениемreinterpret_cast<uint64_t *> потому что естьconst нарушение (кажетсяvolatile ключевое слово мешает)

Ответы на вопрос(8)

Ваш ответ на вопрос