Быстрое извлечение мантиссы и экспоненты (frexp())
От: cepstr Беларусь  
Дата: 03.05.08 10:53
Оценка:
Здравствуйте.

Есть кусок кода, который активно использует функцию frexp():

double frexp(
double x,
int *expptr
);

Gets the mantissa and exponent of a floating-point number.

Компилятор -- MS VC++ 9.0, релиз, оптимизация по скорости.
Профайлер показывает, что эта функция занимает 30% процессорного времени. Если смотреть в asm, то видно, что frexp() вызывается через call, причём внутри она вызывает ещё несколько вспомогательных функций. Intrinsic'a для frexp() в MSVC похоже нет, и заставить компилятор генерировать код без инструкций call я не смог.

Вопрос: как достать из double'а экспоненту и мантиссу максимально быстро?
Я не знаком глубоко с системой команд x86/87, но подозреваю, что FPU должен уметь это делать (знатоки, что скажете?). Очень хочется избваится от call'ов.

Лучшее что я пока придумал -- это доставать мантиссу/экспоненту зная побитное представление double'а при помощи битовых операций. Работает заметно быстрее чем frexp(), но выглядит не элегантно.

А как ещё?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.