home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C!T ROM 5
/
ctrom5b.zip
/
ctrom5b
/
PROGRAM
/
DIVERSEN
/
DOS32V3B
/
LIB
/
SQRT.ASM
< prev
next >
Wrap
Assembly Source File
|
1995-01-21
|
2KB
|
63 lines
;▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐
;▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐
; Writen by Adam Seychell
.386
.model flat
.CODE
comment $
╔═════════════════════════════════════════════════════════════════╗
║ returns EAX with the SQUARE ROOT of EAX. ║
║ ║
║ Uses newtons method: Xn+1 = Xn - f(Xn) / f'(Xn) ║
║ f'(x) is the derivitive of f(x) ║
║ ║
║ For square routes: f(x) = x*x - ( Root value i.e EAX) ║
║ so f'(x) = 2x ║
║ ║
║ For cube routes: f(x) = x*x*x - ( Root value ) ║
║ so f'(x) = 3x ║
╚═════════════════════════════════════════════════════════════════╝$
Public SQRT
SQRT Proc PASCAL USES EDI ECX EBP EDX EBX
mov edi,eax
;----- Get Estimated Root Value ( ebp = rough value of the sqrt of EAX ) ---
bsr ecx,edi ; Get bit number of highest NZ bit
shr cl,1 ; Half this highest bit number
mov ebp,edi ; Rotate Root Value by
shr ebp,cl ; the bit number to get a estimate root.
;----- Main Loop that makes EBP converge to the square root of EDI ------
calc_sqrt_Loop:
push EBP ; save x so can check if x has converged
mov EBX,EBP
shl EBX,1 ; ebx = f'(x) = 2x
mov EAX,EBP
mul EBP
sub EAX,EDI ; eax = f(x) = X*X - Root_value
sbb EDX,0 ; use 64bit subtract
idiv EBX ; eax = f(Xn) / f'(Xn)
sub EBP,EAX ; ebp = Xn+1 = Xn - f(Xn) / f'(Xn)
pop EAX ; look at old value
cmp EBP,EAX ; loop only if new value is different
jne calc_sqrt_Loop
;-------------------------- End of Loop --------------------------------
mov eax,ebp ; EBP now contians the square root of EDI
ret
;────────────────────────────────────────────────────────────────────────────
SQRT Endp
End