Есть кусок кода, который активно использует функцию 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(), но выглядит не элегантно.