Один способ вычисления логарифма по основанию 2
Вычисление логарифмов довольно распространённая операция в цифровой обработке сигналов. Чаще пожалуй приходится считать только свёртки (умножение с накоплением) и амплитуды с фазами. Как правило для вычисления логарифмов на FPGA применяется алгоритм CORDIC в гиперболическом варианте, требующий только таблицы и простых арифметических операций. Однако это не всегда бывает удобно, особенно если проект большой, кристалл маленький и начинаются танцы с оптимизацией. Именно с такой ситуацией и пришлось мне однажды столкнуться. Оба порта блока RAM (Cyclone IV) уже плотненько были в работе, не оставляя свободных окон. Использовать ещё один блок под гиперболический CORDIC не хотелось. Зато был умножитель, для которого во временной диаграмме получалось приличное свободное окно. Денёк подумав, я сочинил следующий алгоритм, в котором не используется таблиц, но есть умножение, точнее возведение в квадрат. И поскольку схемотехнически возведение в квадрат проще общего случая умножения, возможно этот алгоритм представляет интерес для специализированных микросхем, хотя для FPGA разницы конечно нет. Подробнее под катом.
Объяснять что к чему, тут проще для действительных чисел. С них и начнём. К целочисленной реализации перейдём потом.
Пусть есть число X. Требуется найти число Y такое, чтобы .
Положим так же что X лежит в интервале от 1 до 2. Это не слишком ограничивает общность, поскольку X всегда можно перевести в этот интервал умножением или делением на степень двойки. Для Y это будет означать добавление или вычитание целого числа, что делается легко. Итак X лежит в интервале от 1 до 2. Тогда Y будет лежать в интервале от 0 до 1. Запишем Y как бесконечную двоичную дробь:
Коэффициенты в этой записи есть ни что иное, как просто биты двоичного представления числа Y. Причём поскольку Y меньше 1, очевидно что
=0.
Возведём наше первое уравнение в квадрат: и как и ранее, запишем двоичное представление числа 2Y. Очевидно, что
Т.е. биты остались теми же, просто сдвинулись степени двойки. Бита
в представлении нет, потому что он равен нулю.
1) 2$» data-tex=»inline»> , 2Y > 1,
2) , 2Y
В первом случае в качестве нового значения X примем , во втором —
.
В итоге задача свелась к прежней. Новое X опять лежит в интервале от 1 до 2, новое Y от 0 до 1. Но мы узнали один бит результата. Делая такие же шаги в дальнейшем, мы можем получить сколько угодно битов Y.
Посмотрим как это работает в программе на С:
Мы посчитали логарифм с точностью до 16 бит и сравнили с тем, что даёт математическая библиотека. Программа вывела:
res=0.485413, log=0.485427, err=0.002931%
Результат совпал с библиотекой с точностью 0.003%, что показывает работоспособность нашего алгоритма.
Перейдём к целочисленной реализации.
Пусть N-разрядные двоичные беззнаковые числа, отображают интервал [0, 1]. Для удобства будем считать единицей число , а не
, и соответственно двойкой число
. Напишем программу по образу и подобию предыдущей, но работающую с целыми числами:
Поиграв в программе с разными разрядностью чисел (DIG), точностью вычислений (N_BITS), и аргументами логарифма (w), видим, что всё вычисляется правильно. В частности с теми параметрами, которые заданны в этом исходнике, программа выдаёт:
val=0x27819, res=0x9BA5, log=0x9BA6, err=1
Теперь всё готово для того, чтобы реализовать на верилоге железку, делающую точно то же самое, что и функция myLog на С. Переменные s и u в нашей функции можно распечатать в цикле и сравнивать с тем, что выдает симулятор верилога. Соответствие этих переменных железной реализации весьма прозрачно и понятно. u это рабочий регистр, принимающий во время итераций новые значения X. s это сдвиговый регистр, в котором накапливается результат. Интерфейс нашего модуля будет выглядеть вот так:
Входная шина принята 18-разрядной, соответственно разрядности умножителей в Cyclone IV. Числа на наш модуль должны поступать нормализованные. Т.е. со старшим битом, равным единице. В моём проекте это выполнялось автоматически. Но в случае чего реализовать нормализатор, думаю никому труда не составит. Точность вычислений задаётся параметром nbits, по умолчанию равным 16. Модуль считает по одному биту за такт, и за 16 тактов вычислит логарифм с точностью до 16 битов. Если надо быстрее с той же точностью или точнее с той же скоростью, надеюсь никому не составит особого труда разделить модуль на несколько устройств и конвейеризовать.
Запустим тест вот таким скриптом:
Запустив тест, видим окончательный вывод симулятора — value=27819, result=9ba5. Верилог выдал то же самое что С. Временная диаграмма тут довольно тривиальна и особого интереса не представляет. Поэтому её не привожу.
Убеждаемся, что они совпадают бит в бит. Итого, реализация на верилоге повторяет с точностью до бита модель на С. Это и есть тот результат, которого следует достигать, реализуя алгоритмы в железе.
На этом пожалуй всё. Надеюсь кому-то этот мой опыт окажется полезен.
Источник статьи: http://habr.com/ru/post/469327/
Логарифм. Как вычислить логарифм?
Логарифмом положительного числа \(c\) по основанию \(a\) \((a>0, a\neq1)\) называется показатель степени \(b\), в которую надо возвести основание \(a\), чтобы получить число \(c\) \((c>0)\), т.е.
Объясним проще. Например, \(\log_<2><8>\) равен степени, в которую надо возвести \(2\), чтоб получить \(8\). Отсюда понятно, что \(\log_<2><8>=3\).
Аргумент и основание логарифма
Любой логарифм имеет следующую «анатомию»:
Аргумент логарифма обычно пишется на его уровне, а основание — подстрочным шрифтом ближе к знаку логарифма. А читается эта запись так: «логарифм двадцати пяти по основанию пять».
Как вычислить логарифм?
Чтобы вычислить логарифм — нужно ответить на вопрос: в какую степень следует возвести основание, чтобы получить аргумент?
а) В какую степень надо возвести \(4\), чтобы получить \(16\)? Очевидно во вторую. Поэтому:
б) В какую степень надо возвести \(3\), чтобы получить \(\frac<1><3>\) ? В минус первую, так как именно отрицательная степень «переворачивает дробь» (здесь и далее пользуемся свойствами степени ).
в) В какую степень надо возвести \(\sqrt<5>\), чтобы получить \(1\)? А какая степень делает любое число единицей? Ноль, конечно!
г) В какую степень надо возвести \(\sqrt<7>\), чтобы получить \(\sqrt<7>\)? В первую – любое число в первой степени равно самому себе.
д) В какую степень надо возвести \(3\), чтобы получить \(\sqrt<3>\)? Из свойств степени мы знаем, что корень – это дробная степень, и значит квадратный корень — это степень \(\frac<1><2>\) .
В сложных случаях для вычисления логарифма удобно переводить его в показательное уравнение.
Нам надо найти значение логарифма, обозначим его за икс. Теперь воспользуемся определением логарифма:
\(\log_
Что связывает \(4\sqrt<2>\) и \(8\)? Двойка, потому что и то, и другое число можно представить степенью двойки:
\(4=2^<2>\) \(\sqrt<2>=2^<\frac<1><2>>\) \(8=2^<3>\)
Слева воспользуемся свойствами степени: \(a^
Основания равны, переходим к равенству показателей
Умножим обе части уравнения на \(\frac<2><5>\)
Получившийся корень и есть значение логарифма
Зачем придумали логарифм?
Чтобы это понять, давайте решим уравнение: \(3^
А теперь решите уравнение: \(3^
Самые догадливые скажут: «икс чуть меньше двух». А как точно записать это число? Для ответа на этот вопрос и придумали логарифм. Благодаря ему, ответ здесь можно записать как \(x=\log_<3><8>\).
Хочу подчеркнуть, что \(\log_<3><8>\), как и любой логарифм — это просто число. Да, выглядит непривычно, но зато коротко. Потому что, если бы мы захотели записать его в виде десятичной дроби, то оно выглядело бы вот так: \(1,892789260714. \)
\(4^<5x-4>\) и \(10\) никак к одному основанию не привести. Значит тут не обойтись без логарифма.
Воспользуемся определением логарифма:
\(a^=c\) \(\Leftrightarrow\) \(\log_
Зеркально перевернем уравнение, чтобы икс был слева
И не пугайтесь логарифма, относитесь к нему как к обычному числу.
Вот наш корень. Да, выглядит непривычно, но ответ не выбирают.
Десятичный и натуральный логарифмы
Как указано в определении логарифма, его основанием может быть любое положительное число, кроме единицы \((a>0, a\neq1)\). И среди всех возможных оснований есть два встречающихся настолько часто, что для логарифмов с ними придумали особую короткую запись:
Натуральный логарифм: логарифм, у которого основание — число Эйлера \(e\) (равное примерно \(2,7182818…\)), и записывается такой логарифм как \(\ln\).
Десятичный логарифм: логарифм, у которого основание равно 10, записывается \(\lg\).
Основное логарифмическое тождество
У логарифмов есть множество свойств. Одно из них носит название «Основное логарифмическое тождество» и выглядит вот так:
Это свойство вытекает напрямую из определения. Посмотрим как именно эта формула появилась.
Вспомним краткую запись определения логарифма:
Остальные свойства логарифмов вы можете найти здесь . С их помощью можно упрощать и вычислять значения выражений с логарифмами, которые «в лоб» посчитать сложно.
Пример: Найдите значение выражения \(36^<\log_<6><5>>\)
Зная формулу \((a^
Вот теперь спокойно пользуемся основным логарифмическим тождеством.
Как число записать в виде логарифма?
Как уже было сказано выше – любой логарифм это просто число. Верно и обратное: любое число может быть записано как логарифм. Например, мы знаем, что \(\log_<2><4>\) равен двум. Тогда можно вместо двойки писать \(\log_<2><4>\).
Но \(\log_<3><9>\) тоже равен \(2\), значит, также можно записать \(2=\log_<3><9>\) . Аналогично и с \(\log_<5><25>\), и с \(\log_<9><81>\), и т.д. То есть, получается
Таким образом, если нам нужно, мы можем где угодно (хоть в уравнении, хоть в выражении, хоть в неравенстве) записывать двойку как логарифм с любым основанием – просто в качестве аргумента пишем основание в квадрате.
Точно также и с тройкой – ее можно записать как \(\log_<2><8>\), или как \(\log_<3><27>\), или как \(\log_<4><64>\)… Здесь мы как аргумент пишем основание в кубе:
Источник статьи: http://cos-cos.ru/math/75/
Свойства логарифмов. Шпаргалка с формулами.
Любую значимую логарифмическую задачу невозможно решить, не зная особых правил логарифмов. А точнее – основных свойств. К счастью, этих свойств совсем не много и выучить их не составит труда. Но знать их нужно как слева направо, так и в обратную сторону.
Рассмотрим отдельные свойства более детально:
- Логарифмический ноль. Элементарное свойство, которое нужно обязательно помнить. Какое бы ни было основание логарифма, если в аргументе стоит 1, то логарифм всегда равен 0.
- Логарифмическая единица. Еще одно простое свойство: если аргумент и основание логарифма одинаковы, то значение логарифма будет равно единице.
- Основное логарифмическое тождество. Отличное свойство, превращающее четырехэтажное выражение в простейшую b. Суть этой формулы: основание a, возведенное в степень логарифма с основанием а, будет равно b.
- Сумма логарифмов. При умножении логарифмируемых чисел, можно сделать из них сумму 2х логарифмов, у которых будут одинаковые основания. И так невычислимые логарифмы становятся простыми.
- Логарифм частного. Здесь ситуация схожая с суммой логарифмов. При делении чисел мы получаем разность двух логарифмов с одинаковым основанием.
Не каждый студент может себе позволить за семестр в ВУЗе отдать 100 000 ₽ . Но круто, что есть гранты на учебу. Грант-на-вуз.рф – это возможность учиться на желанной специальности. По ссылке каждый получит бонус от 300 ₽ до 100 000 ₽ – грант-на-вуз.рф
- Вынесение показателя степени из логарифма. Тут действуют целых 3 правила. Все просто: если степень находится в основании или аргументе логарифма, то ее можно вынести за пределы логарифма, в соответствии с этими формулами:
- Формулы перехода к новому основанию. Они нужны для выражений с логарифмами, у которых разные основания. Такие формулы в основном используются при решении логарифмических неравенств и уравнений.
Второе свойство применяется, когда меняется местами аргумент и основание логарифма, при этом логарифм переносится в знаменатель.
Напоминаем про сервис грант-на-вуз.рф . Не упусти свой шанс изучать то, что тебе нравится. Ну или просто сэкономить на учебе. Ты точно получишь от 300 ₽ до 100 000 ₽, перейдя по ссылке грант-на-вуз.рф !
Мы разобрали основные свойства логарифмов. Теперь ни одно неравенство или уравнение не останется нерешенным 😉
Спасибо, что прочитали статью. Не забывайте про подписку на канал, а также рекомендую почитать канал наших друзей:
Источник статьи: http://zen.yandex.ru/media/studystudent/svoistva-logarifmov-shpargalka-s-formulami-5e99c14f7c1cd903b767fdab