2015-03-27 3 views
1

Что является самым быстрым способом умножения двух двойных чисел с меньшей точностью (например, Int precision)? Будет ли это быстрее, когда я буду использовать:быстрое двойное умножение с целочисленной точностью

double a = 2.2; 
double b = 3.2; 
int c = int(a)*int(b); 

или есть более быстрый способ?

Редактировать: Швы, такие как преобразование в целую точность, были плохими идеями. Я попытаюсь объяснить свою проблему лучше:

У меня есть набор двойных данных, и мне нужно извлечь некоторые свойства из него, что в основном связано с большим умножением. Теперь я пытаюсь уменьшить время вычисления, уменьшая точность вычисления. Возможно, это будет:

double a = 2.2; 
double b = 3.2; 
float c = float(a)*float(b); 

работать лучше, чем целочисленное преобразование?

+6

Я думаю, что это может дать вам два разных ответа. 'int (a * b)' сначала даст вам 7.04, а затем усекает до 7. 'int (a) * int (b)' будет '2 * 3' или 6. Какой ответ вы хотите? –

+0

Разница между ответами для меня не имеет значения. Меня интересует только быстрое умножение. – BlueSun

+4

Эта операция вряд ли будет вашим узким местом. – Richard

ответ

2
int(a)*int(b); a 1,000,000,000 times: 

real 0m4.946s 
user 0m4.852s 
sys 0m0.018s 

int(a*b); a 1,000,000,000 times: 

real 0m4.067s 
user 0m3.993s 
sys 0m0.010s 

float c = float(a)*float(b); a 1,000,000,000 times: 
real 0m2.815s 
user 0m2.764s 
sys 0m0.010s 

Скомпилировано g++ -O0.

#for_loops

+0

Другими словами, вам лучше делать это умножение, по крайней мере, много раз, чтобы это имело небольшую разницу (это, скорее всего, очень очень преждевременная оптимизация). – PSkocik

+0

Это, конечно же, должно зависеть от процессора, на котором вы его запускаете. Я в настоящее время на Intel (R) Pentium (R) D CPU 3.40GHz', но для компиляции и выполнения таких же циклов на вашем ПК не должно возникнуть проблем. – PSkocik

1
int(a*b); 

здесь вы умножаете два двойники, потому что преобразование выполняется после умножая (также конвертировать в целое, то в два раза, так что вы сделать его более неэффективным, а также не точно)

поэтому, решение второй фрагмент кода, так как и преобразования перед тем умножения

int(a)*int(b) 
+0

Правда. Это также лучший способ сделать это, или есть более быстрое решение? – BlueSun

+0

Добавление приходит мне на ум, но было бы трудно догадаться, потому что современные процессоры делают умножение быстрее, чем предыдущие процессоры. Также вы можете использовать регистры SIMD для умножения достаточно быстрых поплавков (доступно в ). –

2

Это выглядит как (возможно преждевременное) микро-оптимизации для меня и как таковой единственный способ узнать наверняка - это профилировать ваше конкретное приложение. Так много других факторов может повлиять на производительность, например, время, чтобы преобразовать double в целое число и т. Д.

Единственное, что я могу предложить, это то, что если вам не нужно удваивать до тех пор, пока это не произойдет, выполните все начальные вычисление как int, и только преобразовать в double в последнюю возможную минуту, прежде чем вам понадобится двойная точность.

Смежные вопросы