Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: вопрос по ассемблеру
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Malyshko
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
Xenia
Вот! Делюсь с вами вариантом, сочиненным лично. Лично, но все-таки посматривая на то, как это делали предшественники 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 она аргумент не множит.
Andron_
ээээ просветите того, который в танке... это для x86?
Malyshko
Код
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;


вот мой готовый вариант, если кто заинтересуется. Все оказалось намного проще...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.