Меню Рубрики

Как написать log по основанию 2

Один способ вычисления логарифма по основанию 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_=b\) \(\Leftrightarrow\) \(a^=c\)

Что связывает \(4\sqrt<2>\) и \(8\)? Двойка, потому что и то, и другое число можно представить степенью двойки:
\(4=2^<2>\) \(\sqrt<2>=2^<\frac<1><2>>\) \(8=2^<3>\)

Слева воспользуемся свойствами степени: \(a^\cdot a^=a^\) и \((a^)^=a^\)

Основания равны, переходим к равенству показателей

Умножим обе части уравнения на \(\frac<2><5>\)

Получившийся корень и есть значение логарифма

Зачем придумали логарифм?

Чтобы это понять, давайте решим уравнение: \(3^=9\). Просто подберите \(x\), чтобы равенство сработало. Конечно, \(x=2\).

А теперь решите уравнение: \(3^=8\).Чему равен икс? Вот в том-то и дело.

Самые догадливые скажут: «икс чуть меньше двух». А как точно записать это число? Для ответа на этот вопрос и придумали логарифм. Благодаря ему, ответ здесь можно записать как \(x=\log_<3><8>\).

Хочу подчеркнуть, что \(\log_<3><8>\), как и любой логарифм — это просто число. Да, выглядит непривычно, но зато коротко. Потому что, если бы мы захотели записать его в виде десятичной дроби, то оно выглядело бы вот так: \(1,892789260714. \)

\(4^<5x-4>\) и \(10\) никак к одному основанию не привести. Значит тут не обойтись без логарифма.

Воспользуемся определением логарифма:
\(a^=c\) \(\Leftrightarrow\) \(\log_=b\)

Зеркально перевернем уравнение, чтобы икс был слева

И не пугайтесь логарифма, относитесь к нему как к обычному числу.

Вот наш корень. Да, выглядит непривычно, но ответ не выбирают.

Десятичный и натуральный логарифмы

Как указано в определении логарифма, его основанием может быть любое положительное число, кроме единицы \((a>0, a\neq1)\). И среди всех возможных оснований есть два встречающихся настолько часто, что для логарифмов с ними придумали особую короткую запись:

Натуральный логарифм: логарифм, у которого основание — число Эйлера \(e\) (равное примерно \(2,7182818…\)), и записывается такой логарифм как \(\ln\).

Десятичный логарифм: логарифм, у которого основание равно 10, записывается \(\lg\).

Основное логарифмическое тождество

У логарифмов есть множество свойств. Одно из них носит название «Основное логарифмическое тождество» и выглядит вот так:

Это свойство вытекает напрямую из определения. Посмотрим как именно эта формула появилась.

Вспомним краткую запись определения логарифма:

Остальные свойства логарифмов вы можете найти здесь . С их помощью можно упрощать и вычислять значения выражений с логарифмами, которые «в лоб» посчитать сложно.

Пример: Найдите значение выражения \(36^<\log_<6><5>>\)

Зная формулу \((a^)^=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


0 0 голоса
Article Rating
Подписаться
Уведомить о
guest

0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии