| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Asm: Общие вопросы > Возведение в степень |
| Автор: Дрон 24.4.2004, 21:24 |
| Подскажите, пожалуйста, как написать кусок кода (на асме |
| Автор: Chingachguk 24.4.2004, 22:15 | ||
|
| Автор: Дрон 25.4.2004, 10:10 | ||
| Это цитата из твоей статьи на WASM.RU Только меня интересует именно произвольная степень, да и алгоритм должен быть довольно быстрым. Добавлено @ 10:12
А вот нашёл эту книжку. Сейчас скачаю, посмотрю. |
| Автор: Дрон 25.4.2004, 11:25 |
| Хмм... В том, что я скачал ничего толкового не нашёл |
| Автор: Chingachguk 25.4.2004, 17:29 |
| Там глава про сопроцессоры - ты ее видишь ? Там есть статья 82 "Использование сопроцессора для реализации операции возведения в целую положительную степень". |
| Автор: Дрон 25.4.2004, 20:40 |
| Вот оно что! В том архиве было только 58 статей. Буду искать другой... |
| Автор: Дрон 30.4.2004, 18:06 | ||||
| Книжку я так и не достал. Но, поразбиравшись с инструкциями FPU, написал вот такое:
Всё оказалось очень просто. А для возведения числа с плавающей точкой в целую степень написал вот такое. Оно намного эффективней того, что привёл ты. Тут сложность O(log2(n)), а у тебя O(n). Регистры si и di я использовал потому, что в контексте проги остальные были заняты. Показатель -- слово со знаком.
Результат, опять же, в st(0) Короче, ассемблер рулит! PS. Сначала во второй процедуре я написал bt si,15 непосредственно перед jnc Positive потом, подумав, переместил туда, где оно сейчас. В результате время выполнения процедуры уменьшилось на 3% |
| Автор: Sail 15.5.2004, 20:07 | ||||
Я чего то это не понял:
Почему нельзя проще:
Результат останется в ST(0) |
| Автор: Дрон 16.5.2004, 10:47 |
| Sail Так нельзя потому, что для команды f2xm1 степень должна находиться в промежутке от -1 до 1. Поэтому в своей процедуре я отдельно возвожу в целую часть показателя (через fscale) и отдельно в дробную (через f2xm1). |
| Автор: Jin X 30.7.2004, 21:42 |
| Пару дней назад как раз нужно было написать универсальную процедуру возведения в степень, так что ловите исходник! Возводит любые числа в любую степень (ну отрицательные числа в нецелую степень, естественно, не возводит... их никто вам не возведёт И безо всяких циклов ;) Файл можно стянуть вот отсюда: http://filezzz.nm.ru/pub/asm/fpower.zip |
| Автор: Дрон 30.7.2004, 23:20 |
| Jin X Ну так у меня тоже безо всяких циклов -- первый пример для нецелой степени. А второй хоть и с циклом, но работает быстрее первого для целой степени. В моём коде, разве что, нет никаких проверок на обшибку, а в остальном моё ничем не хуже |
| Автор: Jin X 31.7.2004, 17:59 |
| Хе-хе, вот именно, что нету проверок К тому же, у тебя при попытке возвести в любую степень ноль или отрицательные числа будет глюк. Т.к. логарифма от этих чисел нет |
| Автор: Дрон 31.7.2004, 23:13 |
| У меня цель была написать наименьший и наибыстрейший код для динамической генерации процедуры вычисления введённой формулы, а за корректностью пусть пользователь сам следит, или её можно проверять в момент разбора выражения (т.е. один раз) |
| Автор: Jin X 1.8.2004, 21:40 |
| Ладно, проверяй. Только отрицательные числа тоже можно возводить в степень (целую), как и ноль. А на юзера рассчитывать глупо, по-моему. Используй что хочешь, мне нужно было это сделать, я сделал, а сюда написал на случай, если кому пригодится, вот и всё |
| Автор: Дрон 1.8.2004, 22:52 |
| Jin X Да я же не настаиваю. Просто цели были разные. И от твоего, в общем случае толку получается больше. Так что спасибо, может когда-нибудь и проверка понадобится |
| Автор: Ratty 14.6.2005, 14:06 |
| Так получилось, но я завязан на эмулируемой целочисленной 128 битной арифметике (фиксированная точка). Помогите, пожалуйста, получить хотя-бы табличные значения факториал / мантисса для степени 4/3 произвольного числа. У меня есть 128 бит сложение, вычитание, умножение и т.д. в пределах разумного. Вспоминая правила степеней РЕЗУЛЬТАТ = X * X * X * X. Но как из РЕЗУЛЬТАТА найти кубический корень? Где-то встречал правило извлечения квадратного корня - есть ли что-то подобное для кубического корня? Скорость алгоритма не интересует, только точность. |