- 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)
|
|