В программном обеспечении, которое я пишу, я делаю миллионы умножений или деления на 2 (или степени 2) моих значений. Мне бы очень хотелось, чтобы эти значения были int
, чтобы я мог получить доступ к операторам с битрейтом
int a = 1;
int b = a<<24
Однако я не могу, и я должен придерживаться двойников.
Мой вопрос: , поскольку существует стандартное представление удвоений (знак, экспонента, мантисса), есть ли способ играть с показателем, чтобы получить быстрые умножения/деления на мощность 2
Я даже могу предположить, что количество бит будет исправлено (программное обеспечение будет работать на машинах, которые всегда будут иметь удвоение на 64 бита)
P.S: И да, алгоритм в основном выполняет только эти операции. Это узкое место (оно уже многопоточное).
Изменить: Или я полностью ошибаюсь, и умные компиляторы уже оптимизируют для меня вещи?
Временные результаты (с Qt для измерения времени, overkill, но мне все равно):
#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
вмешивается)