Страницы

Поиск по вопросам

понедельник, 10 декабря 2018 г.

Число, кратное 2^n

Из float A, которое может принимать любое значение, нужно получить число, кратное 2n Например, если A = 345.53;, то результат должен быть равен 256.
Пока что в голову ничего, кроме использования условного оператора, не приходит, но это не совсем подходит, но думаю, есть вариант экономнее, так как выполняется это при рендеринге, что и не должно влиять на fps.


Ответ

Простое решение "в лоб" на C (для сравнения скорости):
#include #include int main() { volatile double A=345.53; volatile double r; for(int i=100000000; i--;) r= exp2(floor(log2(A))); printf("%f
", r); }
volatile поставил чтобы было честное вычисление, а не результат спрогнозированный оптимизатором. Проверил на 2х машинах:
Celeron(R) Dual-Core CPU T3100 @ 1.90GHz Intel(R) Core(TM) i5-2500K CPU @ 3.30GHz
Время счёта 17.812 и 9.288 секунд соответственно.
Быстрый переносимый вариант (только тело цикла):
int exp; frexp(A, &exp); r= ldexp(.5, exp);
Время счёта 6.240 и 1.768 секунды.
Вариант зависимый от представления в расчёте на то, что FLT_RADIX==2
r= scalbln(1, ilogb(A));
Последний вариант у меня оказался на селероне немного медленнее -- 7.488 секунд, а на коре немного быстрее -- 1.204 секунды.

Комментариев нет:

Отправить комментарий