реклама на сайте
подробности

 
 
> вопрос по ассемблеру
Malyshko
сообщение Dec 15 2010, 15:31
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 20-11-10
Пользователь №: 61 033



asm
finit
fld const1 {0.55 }
fld x {x 0.55}
fmul {x*0.55 0.55}
fldl2e {log2e x*0.55}
fmul {x*0.275*log2e x*0.55}
f2xm1 {2^p-1 x*0.55}
fadd one {2^p x*0.55}
fst xp
fld xp {xp 2^p}
fmul
fst xp1

вопрос в следующем: мне нужно получить exp(2.75*x), команда f2xm1 возводит в степень -1<X<1. Поэтому я представил
exp(0.55*x), и собирался позвести это в 5 степень, с помощью fmul. В этом-то и вся загвоздка, в конечном выводе у меня получается NAN. Как с этим бороться? sm.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Xenia
сообщение Dec 15 2010, 15:44
Сообщение #2


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Вот! Делюсь с вами вариантом, сочиненным лично. Лично, но все-таки посматривая на то, как это делали предшественники sm.gif

Код
PUBLIC    fastexp
; double fastexp( double x)
fastexp   PROC
  fld    qword ptr [esp+4]; x грузим из стека
  fldl2e
  fmul
  fld    st
  frndint
  fld1
  fscale
  fxch    st(2)
  fsubrp
  f2xm1
  fmul    st, st(1)
  fadd
  ret
fastexp   ENDP

Функция написана для линковки с обычной Сишной программой, которая по общепринятому соглашению заталкивает аргумент в программый стек, а результат ожидает на вершине FPUшного стека.

Не соблаговолите ли испытать? sm.gif

P.S. Это чистая экспонента, на 0.55 она аргумент не множит.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 10:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.01356 секунд с 7
ELECTRONIX ©2004-2016