В некоторых языках, таких как C ++ с frexp , двоичный показатель экспоненты очень дешево представлен как целое число.
Если вам так повезло, вы можете получить предварительно вычисленную таблицу поиска pow2to10
от 2k возможных двоичных показателей до степени 10, что может быть. Иметь другую справочную таблицу lookup10
для степеней 10. Теперь ваши вычисления выглядят следующим образом:
frexp(x , &n);
int i = pow2to10[n];
if (lookup10[i+1] <= x) {
i++;
}
double result = x * lookup10[i];
Теперь вместо серии умножений у вас есть 3 поиска в массивах, одно сравнение и одно умножение. Если вы выполняете это в узком цикле, сохраните pow2to10
как массив short int
, попробуйте урезать диапазоны до того, что вам нужно, и поиски будут в структуре данных, которая может поместиться в кэш L1.
Если вам не так повезло, вы можете вместо того, чтобы многократно умножать, просто сравнить с массивом известных степеней 10. Имейте в виду, что если у вас есть язык высокого уровня, вы можете обнаружить, что накладные расходы на выполнение инструкций превосходит экономию сравнения и умножения. Может быть заманчиво выполнить бинарный поиск для меньшего количества поисков, но я бы поспорил на то, что линейный поиск лучше, потому что это помогает прогнозировать переходы.