Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Возведение в степень, числа с плавающей точкой 
:(
    Опции темы
Дрон
Дата 24.4.2004, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 2
Всего: 92



Подскажите, пожалуйста, как написать кусок кода (на асме smile.gif ), выполняющий возведение в степень для чисел с плавающей точкой одинарной точности (4 байта, тип float в Си). Только без вызовов каких-либо функций. Но, естественно, с использованием математического сопроцессора smile.gif




--------------------
Да. Именно так.
PM   Вверх
Chingachguk
Дата 24.4.2004, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Цитата

  mov  eax,2 ; степень - 2
  call get_pow ; вернется в ST(0) квадрат

...

; ** get_pow: Подпрограмма возведения в целую степень числа *****
; ST(0) - аргумент, eax - степень
; result: ST(0)
; Для возведения в произвольную стпень числа следует воспользоваться
; более сложным алгоритмом с использованием fyl2x:
; см., например, П.И. Рудаков, К.Г. Финогенов
; "Программируем на языке ассемблера IBM PC"
.code
get_pow proc
  test eax,eax
  jnz  @@NoZeroPower
  fstp ST(0) ; Вытолкнуть аргумент из стека
  fld1 ; Загрузить 1.0
  ret ; Вернуть 1.0
@@NoZeroPower:
  push ecx
  mov  ecx,eax
  ; Сделать степень положительной
@@NegLoop: 
  neg  ecx
  js  @@NegLoop
  fld1 ; Загрузить 1.0, ST(0) - накопитель
@@get_pow:
  fmul ST(0),ST(1) ; Накопитель=Накопитель x arg
  loop @@get_pow
  fxch ST(1) ; Поменять накопитель и аргумент
  fstp ST(0) ; Вытолкнуть аргумент из стека
  ; Если степень отрицательна, необходимо
  ; Накопитель=1/Накопитель
  cmp  eax,0
  jge  @@NoNegPow
  fld1 ; Загрузить 1
  fxch ST(1) ; Обменять ST(1) и ST(0)
  fdivp ST(1),ST(0) ; Разделить 1 на Накопитель
@@NoNegPow:
  pop  ecx
  ret
get_pow endp 



--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Дрон
Дата 25.4.2004, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 2
Всего: 92



Это цитата из твоей статьи на WASM.RU smile.gif Ты мне её ещё год назад посоветовал, но по другому поводу smile.gif

Только меня интересует именно произвольная степень, да и алгоритм должен быть довольно быстрым.

Добавлено @ 10:12
Цитата
см., например, П.И. Рудаков, К.Г. Финогенов
; "Программируем на языке ассемблера IBM PC"

А вот нашёл эту книжку. Сейчас скачаю, посмотрю.



--------------------
Да. Именно так.
PM   Вверх
Дрон
Дата 25.4.2004, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 2
Всего: 92



Хмм... В том, что я скачал ничего толкового не нашёл sad.gif


Это сообщение отредактировал(а) Дрон - 25.4.2004, 11:31


--------------------
Да. Именно так.
PM   Вверх
Chingachguk
Дата 25.4.2004, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Там глава про сопроцессоры - ты ее видишь ? Там есть статья 82 "Использование сопроцессора для реализации операции возведения в целую положительную степень".


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Дрон
Дата 25.4.2004, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 2
Всего: 92



Вот оно что! В том архиве было только 58 статей. Буду искать другой...



--------------------
Да. Именно так.
PM   Вверх
Дрон
Дата 30.4.2004, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 2
Всего: 92



Книжку я так и не достал.
Но, поразбиравшись с инструкциями FPU, написал вот такое:
Код
fld показатель
fld основание
fyl2x
fld st(0)
frndint
fld st(0)
fsub st(2)
fxch
f2xm1
fld1
fadd
fscale
fstp st(1)
Результат будет в st(0).
Всё оказалось очень просто.

А для возведения числа с плавающей точкой в целую степень написал вот такое.
Оно намного эффективней того, что привёл ты. Тут сложность O(log2(n)), а у тебя O(n).
Регистры si и di я использовал потому, что в контексте проги остальные были заняты.
Показатель -- слово со знаком.
Код
    mov si, показатель
    bt  si, 15
    fld основание
    fld1
    jnc Positive
    neg si      
    fdivr      
    fld1        
Positive:
    bsr di, si
    jz ZeroPower
    xor cx, cx
    jmp LoopL
DoMul:
    fxch
    fmul st(0),st(0)
    fxch
LoopL:
    bt  si, cx
    jnc SkipL
    fmul st(0), st(1)
SkipL:
    inc cx
    cmp cx, di
    jle DoMul
ZeroPower:
    fstp st(1)

Результат, опять же, в st(0)

Короче, ассемблер рулит! smile.gif

PS. Сначала во второй процедуре я написал bt si,15 непосредственно перед jnc Positive потом, подумав, переместил туда, где оно сейчас. В результате время выполнения процедуры уменьшилось на 3% smile.gif

Это сообщение отредактировал(а) Дрон - 5.5.2004, 13:16


--------------------
Да. Именно так.
PM   Вверх
Sail
Дата 15.5.2004, 20:07 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Я чего то это не понял:
Код

fld показатель
fld основание
fyl2x
fld st(0)
frndint
fld st(0)
fsub st(2)
fxch
f2xm1
fld1
fadd
fscale
fstp st(1)

Почему нельзя проще:
Код

fld показатель
fld основание
fyl2x
f2xm1
fld1
faddp

Результат останется в ST(0)

  Вверх
Дрон
Дата 16.5.2004, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 2
Всего: 92



Sail
Так нельзя потому, что для команды f2xm1 степень должна находиться в промежутке от -1 до 1.
Поэтому в своей процедуре я отдельно возвожу в целую часть показателя (через fscale) и отдельно в дробную (через f2xm1).



--------------------
Да. Именно так.
PM   Вверх
Jin X
Дата 30.7.2004, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 5.3.2004

Репутация: 1
Всего: 1



Пару дней назад как раз нужно было написать универсальную процедуру возведения в степень, так что ловите исходник!
Возводит любые числа в любую степень (ну отрицательные числа в нецелую степень, естественно, не возводит... их никто вам не возведёт biggrin.gif).
И безо всяких циклов ;)
Файл можно стянуть вот отсюда: http://filezzz.nm.ru/pub/asm/fpower.zip
--------------------
Бойся своей мечты, ибо она осуществима!
PM MAIL   Вверх
Дрон
Дата 30.7.2004, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 2
Всего: 92



Jin X
Ну так у меня тоже безо всяких циклов -- первый пример для нецелой степени.
А второй хоть и с циклом, но работает быстрее первого для целой степени.

В моём коде, разве что, нет никаких проверок на обшибку, а в остальном моё ничем не хуже smile.gif


--------------------
Да. Именно так.
PM   Вверх
Jin X
Дата 31.7.2004, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 5.3.2004

Репутация: 1
Всего: 1



Хе-хе, вот именно, что нету проверок smile.gif
К тому же, у тебя при попытке возвести в любую степень ноль или отрицательные числа будет глюк. Т.к. логарифма от этих чисел нет cool.gif
--------------------
Бойся своей мечты, ибо она осуществима!
PM MAIL   Вверх
Дрон
Дата 31.7.2004, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 2
Всего: 92



У меня цель была написать наименьший и наибыстрейший код для динамической генерации процедуры вычисления введённой формулы, а за корректностью пусть пользователь сам следит, или её можно проверять в момент разбора выражения (т.е. один раз) smile.gif


--------------------
Да. Именно так.
PM   Вверх
Jin X
Дата 1.8.2004, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 5.3.2004

Репутация: 1
Всего: 1



Ладно, проверяй. Только отрицательные числа тоже можно возводить в степень (целую), как и ноль. А на юзера рассчитывать глупо, по-моему.
Используй что хочешь, мне нужно было это сделать, я сделал, а сюда написал на случай, если кому пригодится, вот и всё smile.gif
--------------------
Бойся своей мечты, ибо она осуществима!
PM MAIL   Вверх
Дрон
Дата 1.8.2004, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 2
Всего: 92



Jin X
Да я же не настаиваю. Просто цели были разные.
И от твоего, в общем случае толку получается больше.
Так что спасибо, может когда-нибудь и проверка понадобится smile.gif


--------------------
Да. Именно так.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1172 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.