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

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

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

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

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

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

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

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


Временные результаты (с 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 из-за нарушения const (кажется, вмешивается ключевое слово volatile )

25
задан Fezvez 11 October 2011 в 03:09
поделиться