Версия для печати темы

Нажмите сюда для просмотра этой темы в оригинальном формате

WinCity.Ru _ Программирование _ десятичный логарифм

Автор: sting Понедельник, 14 Марта 2005, 11:23

Добрый день....Возникла одна проблемка, может немного не по теме, но все же может поможет кто?? Мне нужно на ассемблере написать прогу вычисления десятичного логарифма... Думал, что проблемой окажется написание самой проги, но получилось так, что я даже не могу найти формулу разложения десятичного логарифма в ряд.... Люди добрые, если кто знает, поделитесь плиз....Буду очень благодарен...

Автор: mokc0der Понедельник, 14 Марта 2005, 16:41

sting, немного по подробнее опишите проблему
1. Ассемблер слишком абстрактно - ассемблеров не одна сотня. (x86 ?)
2. Врядли кто-нить БЕСПЛАТНО напишет полностью готовую прогу по вычислению логарифма, укажите что конкретно не получается - подскажем.
3. Услови задачи допускает использование сопроцессора (AKA x87) ?
4. Как я препдполагаю асм всеже x86. Тогда ОС (ДОС/ВИН/ЛИНУКС) ?
5. Желательно указать что вы используете за компилятор TASM/MASM/FASM etc.

Автор: sting Вторник, 15 Марта 2005, 22:42

В общем используем мы такую программульку как Emu8086 - эмулятор ассемблера...Т.е программульки на нем пишуться как бы под ДОС под х86 процессор...Суть такая, мне нужно написать программу, которая будет вычислять десятичный логарифм числа Х... Так вот, как я понял, для вычисления Х, нужно разложить этот логарифм в ряд (вроде Тейлора), но найти я этого не могу (самого разложения). Мне совсем немножечко, только формулу, а задачку может и сам осилю...Единственное, не знаю как работать с числами с плавающей точкой....Может хоть это кто подскажет... Замечал, что при деление, целая часть заносится в AL, а остаток в AH...Можно конечно на это ориентироваться, но еще не пробовал...

Автор: Квазимодо Среда, 16 Марта 2005, 8:32

Можно использовать такое разложение логарифма в ряд:

ln(X+1)=x-(x^2)/2+(x^3)/3-(x^4)/4+...

(т.е. через сумму слагаемых вида ((-1)^(i-1))*(x^i)/i ). Этот ряд сходится при -1<X<1, а количество его членов, которые необходимо просуммировать, определяется из требуемой точности вычислений (если очередной член ряда по модулю меньше погрешности, то на нем суммирование прекращается). Соответственно, lg X=ln X/ln 10.

Автор: mokc0der Среда, 16 Марта 2005, 8:59

sting, я ОЧЕНЬ сильно сомневаюсь что с такими вопросами, ты способен написать прогу обрабатывающую числа с плавающей точкой без использования сопроцессора blush.gif . Скорее всего надо использовать сопроцеесор, а он позволяет высчитывать натуральный логарифм book.gif . В данном случае посчитать надо примерно так.

Код

finit
fldlg2        ; загружаем значение десятичного логарифма 2 в вершину стека сопроцессора
fld numx;  загружаем число
fyl2x          ; y * log X
...
numx dt 1000.0

Разумеется код ОЧЕНЬ упрощен нет проверок, инициализации, вывода на экран и т.п. в результате этих операций в нулеувом регистре сопроцессора (st0) будет число равное десятичному логарифму числа numx (в данном примере 3.0)

Автор: sting Пятница, 18 Марта 2005, 9:05

В том и проблема, что сопроцессор нам использовать нельзя...

Автор: mokc0der Пятница, 18 Марта 2005, 18:08

sting,
Ну чтож. Тады мой совет таков
1. Хорошо прошерстить и-нет. Наверняка можно найти
Если не поможет
2. Обратись на wasm.ru/forum - там много классных спецов по асму, може у кого есть заготовки
Если не поможет
3. Я бы скомпилял прогу выводящую логарифм на паскале без поддержки сопроцессор - дизассемблировал и разобрался

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