В программе, которую я пишу, я делаю миллионы умножений или делений на 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
)