Binary Hell's main site

 Главная страница 
 Новости 
 Статьи 
 Продукты 
 Документация 
 Наши проекты 
 О группе 
 
 Пишите нам 
 Опыт ФИДО конференций 
 Доки по ASM-у 
 Учебники 
 Форматы файлов 
 

- NICE.SOURCES (2:5030/1334.67) -------------------------------- NICE.SOURCES -
 Msg  : 72 из 888
 From : Pavel Fomin                         2:5026/45.13    Срд 06 Сен 00 19:52
 To   : Denis Sidorov                                       Пон 11 Сен 00 00:26
 Subj : Re: Возведение числа в дробную степень
-------------------------------------------------------------------------------
Hi Denis!

30 Aug 00 22:33, you wrote to All:

 DS> Интеpесyет subj. Hyжны исходники (asm) или алгоpитмы pеализации.
a^b=exp(b*ln(a))
далее идут два варианта:pascal и asm387 for TurboPascal.
Hесколько специфично, т.к. выдрано из большой проги.

=== Cut ===
function Power(a,b:extended):extended;
begin
  if a=0 then begin
    if b<=0 then Power:=config.EZero else
      Power:=0;
    exit;
  end;
  if abs(b*ln(abs(a)))>1.1e4 then begin
    Power:=config.EZero;
    exit;
  end;
  if int(b)=b then begin
    if int(b/2)=(b/2) then
      Power:=Exp(b*ln(abs(a)))
    else
      Power:=Sign(a)*Exp(b*ln(abs(a)));
  end else
    if a>0 then Power:=Exp(b*ln(a)) else
      Power:=config.EZero;
end;

=== Cut ===

=== Cut ===
cw      label  word
tmpqw   dq  ?
__zero proc near
  fld st
  fabs
  fld tbyte ptr _delta
; ST - delta
; ST1 - |X|
; ST2 - X
  fcompp
  fnstsw ax
  test ah,01000001b ;{c3,c1}
  jnz @@zl1 ;{X>=delta}
  mov al,1 ;{X<=delta}
  jmp @@zfin
@@zl1:
  xor al,al
@@zfin:
  retn
__zero endp

x87power proc far
  push bp
  mov bp,sp
  fld x1 ;x1
  fnstcw cw
  mov ax,cw
  and ah,0F3h
  or ah,04h
  mov cw,ax
  fldcw cw
  call __zero
  test al,al
  ftst ;x2,x1
  fnstsw ax
  mov bx,ax
  fld x2 ;x2,x1
  jz @@po1
  ftst
  fnstsw ax
  fcompp ;_
  test ah,01000001b
  jz @@po0
;b<=0
  fld _ezero
  jmp @@pofin
@@po0:
  fldz
  jmp @@pofin
@@po1:
;a<>0
  test bh,1
  jz @@po2
  fld st ;x2,x2,x1
  frndint
  fcomp st(1) ;x2,x1
  fnstsw ax
  test ah,01000000b
  jz @@poer
;  fstp st ;
  fld dword ptr _onehalf
  fmul st,st(1) ;x2/2,x2,x1
  fld st ;x2/2,x2/2,x2,x1
  frndint ; [x2/2],x2/2,x2,x1
  fcompp ;x2,x1
  fnstsw ax
  test ah,01000000b
  jz @@po2
  mov bh,0
@@po2:
;a>0
  fxch st(1) ;a,b
  fld1 ;1,a,b
  fxch st(1) ;a,1,b
  fabs
  fyl2x ;l2(|a|),b
  fmulp st(1),st

  ficom MaxPow
  fnstsw ax
  sahf
  jnc @@poer

  fld st
  frndint
  fsub st(1),st
  fld1
  fscale
  fstp st(1)
  fxch st(1)
  f2xm1
  fld1
  faddp
  fmulp
  test bh,1
  jz @@pofin
  fchs
  jmp @@pofin
@@poer:
  fcompp
  fld tbyte ptr _ezero
@@pofin:
  pop bp
  retf 20d
x87power endp

[...]
 EXTRN _delta:TBYTE
 EXTRN _ezero:TBYTE
_onehalf DD 0.5
MaxPow  dw 16384
=== Cut ===

_ezero/config.ezero - число, возвращаемое в случае невозможности вычисления.
_delta/config.delta - "почти ноль", т.е. вместо if a=0 пишется if abs(a)<delta.
Зачем это надо, сам догадаешься или подсказать?

Pasha 1st, RU.PASCAL[.SOURCES|.CHAINIK]

... Говорила мне мама: "Hе лезь в системщики"
--- GoldED/W32 3.0.1-asa9 SR3
 * Origin: Windows имеет всех, кто ее имеет (2:5026/45.13)

  

Rambler's Top100 Rambler's Top100 NET's Top100