Из float A, которое может принимать любое значение, нужно получить число, кратное 2n
Например, если A = 345.53;, то результат должен быть равен 256.
Пока что в голову ничего, кроме использования условного оператора, не приходит, но это не совсем подходит, но думаю, есть вариант экономнее, так как выполняется это при рендеринге, что и не должно влиять на fps.
Ответ
Простое решение "в лоб" на C (для сравнения скорости):
#include
", 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 секунды.
Комментариев нет:
Отправить комментарий