![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| EvilsInterrupt |
|
|||
|
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. |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 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 секунд разумеется номер старшего разряда числа - это округление вниз |
|||
|
||||
| EvilsInterrupt |
|
|||
|
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 |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
Alexeis, ты уверен, что его такая точность устроит?
правда я считаю, что если нужна более высокая точность, то быстрее, чем с помощью FPU, посчитать не получится Добавлено через 2 минуты и 9 секунд http://graphics.stanford.edu/~seander/bith...html#IntegerLog |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Lazin, для моих целей подошло. Да и проц. без FPU, так пришлось выкручиваться
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| EvilsInterrupt |
|
|||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
Мне по-точнее надо! ;) Но способ описал выше! ;)
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |