[an error occurred while processing this directive]
|
То, что деление на 2 - это сдвиг, не вызвает сомнений. Проц 2812. Там нет деления.
Вообщем алгоритм над которым я шаманил следующий:
1. Считаем количество нулей спереди без знака и сохраняем для нормализации (N)
2. Нормализуем число, сдвигом влево на N
3. Составляем разность: IQ(1)>>N - нормализованное число
4. Выбираем из таблицы число sqrt(1/2^N)
5. Выбираем из таблицы число sqrt(1/2^(N+1))
6. Составляем разность значений п.4-п.5 (можно использовать таблицу разностей, просто так понятнее).
7. Сдвигаем разность из п. 6 на N влево
8. Разность из п.3 умножаем на число из п.7 и получаем готовое решение. Для чисел близких к нулю - великолепно. От 0.5 до 1 - страдает :(