Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функция вычисления логарифма по основанию 2, Своего рода "проверка на вшивость" 
:(
    Опции темы
EvilsInterrupt
Дата 17.10.2009, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



Для тех кому интересно поломать голову и побаловать, то приложу задачку ту, которую, кажется, уже решил и сейчас тестирую на работоспособность. Но хочется видеть и другие решения, возможно чье-то окажется лучше чем мое ;)

Ограничения при решении задачи:
1) Запрещено использовать типы float, double и др. с плавающей точкой
2) Запрещено использовать математические функции из math.h
3) Используется либо С++ с минимальными извратами, а лучше чистый С
4) Используются только типы stdint.h -> uint8_t, uint16_t, uint32_t

Ограничения обсуждению не подлежит это так и все! Если нет силенок для решения, значит забейте и идите дальше, эта задачка вам не по зубам! ;)

Главная цель:
Написать функцию вычисления логарифма по основанию 2 от целого числа. Главным критерием выступает эффективность скорости должна быть как можно выше!

Дополнительные данные:
Эта функция будет вычислять логарифм для чисел, которые являются вероятностью значения байта в заданном исходном буфере buf_ptr размером в buf_len байт, которая и нуждается в функции вычислении логарифма. Еще раз в функцию MainFunc передали аргументы buf_ptr, buf_len  и она в своем теле нуждается в коде, который применяет функцию log2.
PM MAIL WWW ICQ Jabber   Вверх
GoldFinch
Дата 17.10.2009, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



1) входные значения - натуральные числа, от 1, 2, ... MAX_IN ?
2) выходные значения - округленные значения log2(x), 
0=log2(1)
1=log2(2)
2=~1.58=log2(3)
2=log2(4)
2=~2.32=log2(5)
3=~2.58=log2(6)
....
или значения с фиксированной дробной частью?

если входной диапазон uint8_t или uint16_t или даже uint32_t - очевидное решение таблица
потому что log2(2^32) = 32, значит для входного значения типа uint32_t достаточно таблицы порядка 32 элементов

Более того,
log2(x) = log2(2^n+o(2^n)) ~= n
значит достаточно найти номер старшего разряда числа

Добавлено через 11 минут и 35 секунд
разумеется номер старшего разряда числа - это округление вниз
PM MAIL ICQ   Вверх
EvilsInterrupt
Дата 17.10.2009, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



Правильно подумал, таблица! А чтобы не мучать мозг сделал таблицу на элементах uint32_t.

Чего сделал пока?
Разработал прогу , которая открывает виндовые(c:\windows\) PE-файлы и вычисляет максимальную вероятность встречаемую в секции на которую указывает PE->OptionalHeader.AddressOfEntryPoint, получил вероятность Pwin_max, ну и на него заложился )
Далее начал юзать правило: log(a * b) = log(a) + log(b)

Это сообщение отредактировал(а) EvilsInterrupt - 17.10.2009, 13:14
PM MAIL WWW ICQ Jabber   Вверх
Alexeis
Дата 22.10.2009, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Код

int Log2 (unsigned x)
{
    if (x == 0) return 32;
    int n = 0;
    if (x <= 0x0000ffff) {n = n + 16; x = x << 16;}
    if (x <= 0x00ffffff) {n = n + 8; x = x << 8;}
    if (x <= 0x0fffffff) {n = n + 4; x = x << 4;}
    if (x <= 0x3fffffff) {n = n + 2; x = x << 2;}
    if (x <= 0x7fffffff) {n = n + 1;}
    return 31 - n;
}




--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Lazin
Дата 22.10.2009, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Alexeis, ты уверен, что его такая точность устроит?
правда я считаю, что если нужна более высокая точность, то быстрее, чем с помощью FPU, посчитать не получится  smile

Добавлено через 2 минуты и 9 секунд
http://graphics.stanford.edu/~seander/bith...html#IntegerLog
PM MAIL Skype GTalk   Вверх
Alexeis
Дата 22.10.2009, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Lazin, для моих целей подошло. Да и проц. без FPU, так пришлось выкручиваться smile .


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
EvilsInterrupt
Дата 22.10.2009, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



Мне по-точнее надо! ;) Но способ описал выше! ;)
PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0625 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.