Быстрое умножение / деление на 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
ключевое слово мешает)