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

 
 
 
Reply to this topicStart new topic
> вопрос по ассемблеру
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
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
Andron_
сообщение Dec 16 2010, 00:11
Сообщение #3


.NET developer
***

Группа: Свой
Сообщений: 218
Регистрация: 20-10-07
Из: Новосибирск
Пользователь №: 31 532



ээээ просветите того, который в танке... это для x86?
Go to the top of the page
 
+Quote Post
Malyshko
сообщение Dec 16 2010, 15:11
Сообщение #4


Участник
*

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



Код
procedure FPP(xin: single;var yout: single);
var x,xp,xp1,xp3,xp4,xp5,xp6,xp7,xp2,y,const1,const2,one,two: single;
begin
     one:=1.0000;
     two:=2.0000;
     const1:=0.55;
     x:=xin;
     y:=0.0;
     asm
     finit
     fld xin
     fld xin
     fmul st(0),st(1)
     fmul st(0),st(1)
     fsqrt
     fsqrt
     fst xp1  {x^0.75}

     fld xp1 {koren' iz 1-z v xp2}
     fchs
     fadd one
     fsqrt
     fst xp2

     fld xp1
     fadd one
     fsqrt
     fst xp3

     fld xp2
     fld xp3
     fpatan {arctg(x)^0.75}
     fmul two
     fst xp4 {arccos}

     fld xin
     fmul const1
     fldl2e
     fmul st(0),st(1)
     f2xm1
     fadd one
     fst xp5

     finit

     fld xp5
     fld xp5
     fmul st(0),st(1)
     fmul st(0),st(1)
     fmul st(0),st(1)
     fmul st(0),st(1)
     fst xp6

     fld xp6
     fld xp4
     fmul st(0),st(1)
     fst xp7

end;
     yout:=xp7;
end;


вот мой готовый вариант, если кто заинтересуется. Все оказалось намного проще...
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 13:58
Рейтинг@Mail.ru


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