Как быстро найти любой логарифм с помощью обычного цикла
На прошлой неделе мы рассказали, что такое логарифм и зачем он нужен. Сегодня найдём логарифм с помощью программирования.
Вот короткая версия теории:
- Логарифм — это в какую степень нужно возвести одно число, чтобы получить другое число.
- То, число, которое возводят в степень, называется основанием логарифма.
- Логарифм обозначается словом log.
- Например, log(10) 100 = 2, потому что 10² = 100.
- Есть ещё обозначение lg — это то же самое, что log(10). И есть ln — это то же самое, что log(e), где e — это число Эйлера, важная математическая константа.
- Логарифмы используются в каждой значимой области нашей жизни, от биологии до физики.
Теперь, когда мы знаем достаточно про логарифм, то можем написать программу, которая нам найдёт любой логарифм по любому основанию.
В чём идея
Мы уже выяснили, что логарифм — это степень, в которую нужно возвести основание логарифма, чтобы получить нужное число.
Алгоритм поиска будет таким:
- Найдём минимальное значение степени, возведение в которую ещё не превысит наше число.
- Это значит, что следующее за ним целое число — уже перебор, и основание в этой степени точно превысит наше число.
- Будем делить этот промежуток пополам нужное количество раз, пока не получим нужную точность ответа после запятой.
- Когда цикл закончится, середина оставшегося промежутка и будет ответом.
Мы так уже делили границы пополам в задаче про то, как угадать число за 7 попыток, поэтому, если алгоритм показался немного непонятным, — перечитайте то решение и возвращайтесь сюда.
Готовим переменные
Для работы программы пользователь должен будет указать три вещи:
- Основание логарифма.
- Число, от которого мы берём этот логарифм.
- Точность решения. Точность указываем в количестве точно вычисленных знаков после запятой.
Выделим переменные для этого:
# на старте границы поиска значения логарифма все равны нулю start = 0 end = 0 middle = 0 # логарифм какого числа мы ищем num = 600 # основание логарифма base = 10 # сколько нужно знаков после запятой accuracy = 4
Вычисляем границы
Поиск делаем так: начинаем считать от нуля и на каждом шаге увеличиваем это значение на единицу. Как только мы превысили аргумент (то, от чего берём логарифм) — это наша конечная граница. Соответственно, предыдущее значение, которое на единицу меньше, будет стартовой границей.
# пока основание в очередной степени не превысило само число — while base**end <= num: # увеличиваем конечную границу поиска на единицу end += 1 # откатываемся на один шаг назад от конечной границы, чтобы найти начальную границу start = end - 1
Проверяем, вдруг мы сразу нашли решение
На всякий случай перед тем, как идти дальше, проверим, будет ли решением наша стартовая граница — это сразу может сэкономить нам много сил в дальнейшем:
Проверяем, вдруг мы сразу нашли решение На всякий случай перед тем, как идти дальше, проверим, будет ли решением наша стартовая граница — это сразу может сэкономить нам много сил в дальнейшем: # если сразу нашли целое значение степени if base**start == num: # выводим решение print('log(' + str(base) + ')' + str(num) + ' = ' + str(start)) # останавливаем программу exit(0)
Считаем логарифм
Мы будем считать логарифм не классическим способом из высшей математики, а простым приближением — найдём ответ с приемлемой точностью. За точность отвечает переменная accuracy
, но в цикле мы её умножим на 4. Это неочевидный ход, поэтому сейчас объясним, в чём тут дело.
На каждом шаге цикла мы делим границу пополам, но если деление выпадает на чётную значимую цифру, то при делении у нас не увеличится количество знаков после запятой. Например, если нам нужна точность 2 знака после запятой, то если вторым шагом цикла мы разделим 0,4 на 2, то у нас останется один знак после запятой (0,2). Таких делений может быть 4 подряд, прежде чем мы доберёмся до следующего знака: 8 → 4 → 2 → 1, поэтому мы и умножаем требуемую точность на 4 — чтобы гарантированно получить нужную точность.
Теперь запишем этот цикл на языке программирования. Его можно было сделать изящнее, например, вложив условные операторы друг в друга или используя оператор множественного выбора, но так получается нагляднее:
# организуем цикл, чтобы получить нужную точность после запятой for i in range(accuracy*4): # увеличиваем счётчик цикла i += 1 # находим серединное значение middle = (start + end) / 2 # если основание в этой степени больше нашего числа, то сдвигаем к середине конечную границу if base**middle > num: end = middle # если основание в этой степени больше нашего числа, то сдвигаем к середине начальную границу if base**middle < num: start = middle # если основание в этой степени равно нашему числу if base**middle == num: # выводим ответ и выходим из цикла print('log(' + base + ')' + num + ' = ' + start) break
Выводим ответ
Это самая простая часть алгоритма:
# когда цикл закончился — выводим ответ print('log(' + str(base) + ')' + str(num) + ' = ' + str(middle))
Проверяем работу
Для проверки посчитаем log(10) 600 с помощью нашей программы:
Ответ программы — 2,77815 с точностью 5 знаков после запятойТеперь запустим калькулятор и проверим наше решение:
Первые 5 знаков после запятой — те же самые, значит? Алгоритм работает верно# на старте границы поиска значения логарифма все равны нулю start = 0 end = 0 middle = 0 # логарифм какого числа мы ищем num = 600 # основание логарифма base = 10 # сколько нужно знаков после запятой accuracy = 5 # пока основание в очередной степени не превысило само число — while base**end <= num: # увеличиваем конечную границу поиска на единицу end += 1 # откатываемся на один шаг назад от конечной границы, чтобы найти начальную границу start = end - 1 # если сразу нашли целое значение степени if base**start == num: # выводим решение print('log(' + str(base) + ')' + str(num) + ' = ' + str(start)) # останавливаем программу exit(0) # организуем цикл, чтобы получить нужную точность после запятой for i in range(accuracy*4): # увеличиваем счётчик цикла i += 1 # находим серединное значение middle = (start + end) / 2 # если основание в этой степени больше нашего числа, то сдвигаем к середине конечную границу if base**middle > num: end = middle # если основание в этой степени больше нашего числа, то сдвигаем к середине начальную границу if base**middle < num: start = middle # если основание в этой степени равно нашему числу if base**middle == num: # выводим ответ и выходим из цикла print('log(' + base + ')' + num + ' = ' + start) break # когда цикл закончился — выводим ответ print('log(' + str(base) + ')' + str(num) + ' = ' + str(middle))
Текст:
Михаил Полянин
Редактор:
Максим Ильяхов
Художник:
Даня Берковский
Корректор:
Ирина Михеева
Вёрстка:
Кирилл Климентьев
Соцсети:
Алина Грызлова
1 логарифм
Вы искали 1 логарифм? На нашем сайте вы можете получить ответ на любой математический вопрос здесь. Подробное решение с описанием и пояснениями поможет вам разобраться даже с самой сложной задачей и 2 в степени логарифм 2 по основанию 3, не исключение. Мы поможем вам подготовиться к домашним работам, контрольным, олимпиадам, а так же к поступлению в вуз. И какой бы пример, какой бы запрос по математике вы не ввели — у нас уже есть решение. Например, «1 логарифм».
Применение различных математических задач, калькуляторов, уравнений и функций широко распространено в нашей жизни. Они используются во многих расчетах, строительстве сооружений и даже спорте. Математику человек использовал еще в древности и с тех пор их применение только возрастает. Однако сейчас наука не стоит на месте и мы можем наслаждаться плодами ее деятельности, такими, например, как онлайн-калькулятор, который может решить задачи, такие, как 1 логарифм,2 в степени логарифм 2 по основанию 3,2 в степени логарифм 3 по основанию 2,3 в степени логарифм 2 по основанию 3,3 в степени логарифм 3 по основанию 2,log 0,log a x a,log a x y,log x,log x y,log в математике это,log что означает в математике,log что это такое в математике,log0,x log y,x y log,y a x log,выразить логарифм через логарифм,вычисление логарифмов,вычитание логарифмов,вычитание логарифмов с одинаковым основанием,действия над логарифмами,как выразить логарифм через логарифм,как вычислить логарифм числа,как вычислять логарифмы,как вычитать логарифмы с одинаковым основанием,как делать логарифмы,как из числа сделать логарифм,как логарифмировать число,как найти логарифм,как найти логарифм числа,как находить логарифмы,как понять логарифмы,как прологарифмировать число,как решать логарифм в степени,как решать логарифм в степени числа,как решать логарифмы в степени,как сделать логарифм из числа,как считается логарифм,как считать логарифм,как считать логарифмы,квадратный логарифм,когда логарифм равен 1,лог 1 по основанию 1,логарифм 0,логарифм 0 равен,логарифм 1 по основанию 1,логарифм 1 равен,логарифм 10,логарифм 10 по основанию 10 равен,логарифм 5,логарифм в квадрате формула,логарифм в степени как решать,логарифм в степени числа как решать,логарифм всегда положительный,логарифм дроби,логарифм как найти,логарифм как решается,логарифм как считается,логарифм как считать,логарифм нуля равен,логарифм от 0,логарифм от 1,логарифм от нуля,логарифм от числа,логарифм положительного числа b по основанию a,логарифм равен 0,логарифм равен 1,логарифм равен нулю,логарифм решение,логарифм с дробным основанием,логарифм числа 1 по основанию 1,логарифм числа логарифм степени,логарифмическая прогрессия,логарифмические,логарифмы как вычислить,логарифмы как находить,логарифмы как решать в степени,логарифмы решения,логарифмы сложение,логарифмы умножение,обратный логарифм,операции с логарифмами,основные свойства логарифмов формулы,перемножение логарифмов,преобразования логарифмов,преобразования логарифмов формулы,примеры логарифмов,пять в степени логарифм 8 по основанию 5,разложение логарифма,разность логарифмов с одинаковым основанием,решение логарифма,решение логарифмов натуральных,свойства логарифмов преобразование логарифмических выражений,сложение и вычитание логарифмов с одинаковыми основаниями,сложение логарифмов,сложение логарифмов с одинаковым основанием,сложение логарифмов с одинаковыми основаниями,сложение логарифмы,сумма логарифмов по одинаковому основанию,умножение логарифмов,умножение логарифмы,условия существования логарифма,формулы преобразования логарифмов,частное логарифмов,частное логарифмов с одинаковым основанием,чему равен log,чему равен логарифм 1,число в степени логарифма как решать,число в степени логарифма число,число перед логарифмом,что такое log в математике.
Решить задачу 1 логарифм вы можете на нашем сайте https://pocketteacher.ru. Бесплатный онлайн решатель позволит решить онлайн задачу любой сложности за считанные секунды. Все, что вам необходимо сделать — это просто ввести свои данные в решателе. Так же вы можете посмотреть видео инструкцию и узнать, как правильно ввести вашу задачу на нашем сайте. А если у вас остались вопросы, то вы можете задать их в чате снизу слева на странице калькулятора.
Простой способ вычислить логарифмы без калькулятора?
спросил
Изменено 2 года, 10 месяцев назад
Просмотрено 179 тысяч раз
$\begingroup$
Мне нужно уметь вычислять логарифмы без использования калькулятора, только на бумаге. Результат должен быть дробным, чтобы он был наиболее точным. Например, я видел это на уроке математики, вычисленное одним из моих одноклассников без помощи калькулятора. 93)}=\dfrac{7\log_a2}{3\log_a2}=?$$
Ясно, что $\log_a2$ ненулевое конечное число для конечного вещественного $a>0,\ne1$
См. Законы логарифмов
$\endgroup$
$\begingroup$
Как вы уже видели, вычислить их вручную может быть уйма работы. Итак, в контексте «без калькулятора» я хотел бы отметить, что логарифмическая линейка была сделана почти точно для этого типа расчета!
$\endgroup$ 92 $ и так $\sqrt 2 \приблизительно 10 / 7 = 1,4 $
После некоторой практики вы сможете очень быстро получать приближения в пределах 1%, часто в уме.
При наличии карандаша и бумаги часто можно быстро удвоить точность за одну итерацию метода Ньютона. Например:
$\sqrt 2 / 1,4 \приблизительно 1,42857 $, поэтому более точное приближение равно $\sqrt 2 \приблизительно (1,4 + 1,42857)/2 = 1,414285 $.
Повторение снова дает $\sqrt 2 \приблизительно 1,41421356 $, что так же точно, как многие ручные калькуляторы. 98 = 25 600 000 000\\ \log_{20} 25 600 000 000 \приблизительно 8\\ \ln 25 600 000 000 \приблизительно 8 \cdot 3 = 24\\ \ln 34 627 486 221 = \ln 25 600 000 000 + \ln (34 627 486 221 / 25 600 000 000) \приблизительно 24 + \ln 1,35 \приблизительно 24,35$$
Ответ: скидка всего 0,13%, что очень точно.
Надеюсь, это поможет!
$\endgroup$
$\begingroup$
В учебнике Апостола «Исчисление», том 1, разработана формула вычисления логарифма. Приводится конкретный пример $\log 2$, в результате чего получается 0,69 доллара США{1/n} — 1 \right)$$
Если $n$ является степенью $2$, вы получите много квадратных корней. См. в материалах HHC 2018 статью о вычислении логарифмов.
Как правило, степенные ряды эффективны для натуральных логарифмов чисел, близких к $1$. Вы можете сделать что-нибудь, чтобы приблизить свое число к 1 доллару, например, умножить на степень десяти или извлечь квадратный корень, а затем скорректировать полученный логарифм.
Тем временем запомните число $0,4343$. Это приблизительный логарифм $e$. Используйте это, чтобы преобразовать натуральные журналы в десятичные журналы.
$\endgroup$
2
запрос ссылки — Самый эффективный способ численного вычисления логарифма?
Это… зависит. $\def\artanh{\operatorname{artanh} } \def\larr{\leftarrow}$
Является ли тот или иной подход хорошим выбором, зависит от многих факторов:
Какие арифметические действия/операции доступны/могут использоваться? Что их затраты в.р.т. время выполнения, использование памяти (статической и динамической, энергозависимая и энергонезависимая), потребление кремния, потребление тока.
Это абсолютная ошибка или относительная ошибка?
Это арифметика с фиксированной точкой или с плавающей запятой?
Известна ли заранее требуемая точность и какова она? Или это для какой-то библиотеки произвольной точности, такой как MPFR?
Диапазон известен заранее? Или это для какой-то универсальной библиотеки, которая должен обрабатывать любой диапазон ввода?
Если используется арифметика с фиксированной точкой, необходимо соблюдать особую осторожность, чтобы промежуточные результаты не переполнялись, соответственно. такие подходы, как ряд Тейлора, могут быть устаревшими. В этом случае рассмотрите полиномы Бернштейна, вычисленные с использованием алгоритма Де Кастельжо, который избегает промежуточного переполнения по замыслу, если контрольные точки представимы.
Какие показатели «оптимальны»? Точность? Скорость исполнения? Потребление кода? Потребление памяти? Простота реализации? . ..
Что касается аппаратного обеспечения, то CORDIC может оказаться подходящим вариантом. В программном обеспечении это зависит от какие инструкции доступны и как они выполняются. КОРДИК это обычно выгодно, если сдвиг намного на быстрее, чем умножение.
Несколько месяцев назад я реализовал двойную эмуляцию IEEE-754 для 8-битного микроконтроллер, и хотя эмулированное умножение очень дорогой (занимает около 1000 циклов), аппроксимация полиномами лучше CORDIC, который был реализован товарищем. Алгоритм идет в основном вот так:
Сокращение диапазона до $[1,2]$, а затем до $[1/\sqrt2, \sqrt2]$. Это в основном без операции с двоичной плавающей запятой, потому что мантисса остается неизменной.
Вычислить $$\ln x = 2\artanh\frac{x-1}{x+1}$$ Этот ряд намного лучше подходит, чем ряд Меркатора, разложение Тейлора $\ln$ около 1. Обратите внимание, что скорость сходимости ряда Маклорена для $\artanh$ с приведенным выше аргументом в основном то же самое, когда $x$ заменен на $1/x$. 2 \приблизительно 0,029k) — k\ln2$ все нам нужно добавить целое число, кратное $\ln2$.
Помимо уменьшения дальности, требуется 9 дополнений, 9 умножение и 1 деление.
Гораздо более элементарным подходом является следующий алгоритм, похожий на патрубок. Обратите внимание, что
Возведение числа в квадрат сдвигает его показатель степени по основанию 2 на единицу влево.
Деление числа на 2 уменьшает его показатель степени по основанию 2 на 1.
$\log_2x$ числа $x$ имеет представление 92$
Если $x\geqslant2$, то $b_n\larr 1$, иначе $b_n\larr0$
Если $x \geqslant2$, то $x \larr x/2$
$n\larr n+1$
перейти к 3
Полиномы MiniMax работают лучше, чем ряды Тейлора той же степени. Преимущество Тейлора в том, что его легко найти для большинства функций. вам может понадобиться.
Еще несколько замечаний: