Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Поиск логарифма


Автор: lamber 12.6.2011, 22:15
Вот возник нечаянно, негаданно вопрос, как найти логарифм, n-ого основания, либо вообще любого т.к. все мы знаем формулу преобразования одного основания в другое. Можно спросить нахрен мне это надо т.к. эта функция есть в math.h а так же в математическом сопроцессоре. тем не менее хочется знать, гуглил и нашел только алгоритмы для нахождения целой части логарифма и все. Знаю что есть несколько способов нахождения, хотелось бы узнать основные.

Автор: afiskon 12.6.2011, 22:34
Одно из возможных решений - http://eax.me/genetic-algorithms/ (простите за самопиар).  Можно получить функцию для log, sin, cos, sqrt - чего угодно. А вообще - ряды Тейлора.

Автор: lamber 12.6.2011, 22:49
2afiskon
только засел за чтение твоего блога (мистика нах), подумал еще дельно пишет, жаль что на Перле в основном. Сори за офф топ.

По теме да самопиар т.к. тема запощена в C++, а пример на Перле и конкретного ответа на мой вопрос там нет. Так что жду ответов господа)))
PS
Придерживаюсь услышанного мнения что Перл придумали профессиональные извращенцы.

Автор: Фантом 12.6.2011, 22:56
Первый простейший способ - разложение в ряд Тейлора в окрестности единицы (для облегчения жизни - с предварительным отбрасыванием целой части логарифма). 

Второй - использование сравнительно быстро сходящегося ряда ln( (1+x)/(1-x) ) = 2 * (x + x^3/3 + x^5/5 + x^7/7 + ...).  Понятно, что сначала надо представить аргумент в виде (1+x)/(1-x), но это совершенно элементарно.

Третий - использовать цепные дроби. Точное выражение не помню, но что-то хорошее там существует.

Ну и т.п.

Автор: afiskon 12.6.2011, 23:19
lamber, плохо читали значит.
Цитата

http://ru.wikipedia.org/wiki/Генетический_алгоритм позволяют подобрать коэффициенты полинома таким образом, чтобы его график проходил максимально близко к графику аппроксимируемой функции.


Вот собственно весь ответ на ваш вопрос. Далее идут только детали того, как подбирались коэффициенты.

Автор: lamber 12.6.2011, 23:27
2afiskon
Думаю ГА для такой задачи это из пушки по воробьям

2Фантом

Можно первые два метода набросать основную идею в коде. По второму методу не понял что мы делаем с x, получаем его путем x' = (1+x)/(1-x) либо мы в сходящийся ряд подставляем просто аргумент.

Автор: Фантом 12.6.2011, 23:57
Цитата(lamber @  12.6.2011,  23:27 Найти цитируемый пост)

Можно первые два метода набросать основную идею в коде.

Да что там набрасывать-то - это банальный подсчет суммы ряда.

Цитата(lamber @  12.6.2011,  23:27 Найти цитируемый пост)
По второму методу не понял что мы делаем с x, получаем его путем x' = (1+x)/(1-x) либо мы в сходящийся ряд подставляем просто аргумент.

Если мы ищем ln(y), то находим такой x, что y = (1+x)/(1-x), а потом пользуемся вышеприведенной формулой.

Автор: lamber 13.6.2011, 00:25
2Фантом

По второй формуле тогда вопрос, каким способом сделать преобразование y = (1+x)/(1-x), я имею ввиду в коде, на бумаге, сложности не представляет)))

Автор: Фантом 13.6.2011, 00:29
Цитата(lamber @  13.6.2011,  00:25 Найти цитируемый пост)

По второй формуле тогда вопрос, каким способом сделать преобразование y = (1+x)/(1-x), я имею ввиду в коде, на бумаге, сложности не представляет))) 

Так на бумаге и сделать. Если y=(1+x)/(1-x), то x=(y-1)/(y+1). Кодирование этого, думаю, сложности не представляет.  smile 

Автор: lamber 13.6.2011, 00:39
Все до петрил, сенкс что разжевал все такому тупице как я )))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)