А заодно в виде упражнения и кубический 8)
Код:
;=======================================================================
; E = CBRT(HL)
;-----------------------------------------------------------------------
cbrt:
;-----------------------------------------------------------------------
push h
lxi d,16 shl 8
.loop:
mov a,e
add e
mov e,a
mov h,e
inr h
push d
call umul88
pop d
push h
pop b
dad h
dad b
inx h
mov a,d
dcr a
jz .ok
.shift:
dad h
jc .skip
dcr a
jnz .shift
.ok:
pop b
mov a,c
sub l
mov l,a
mov a,b
sbb h
jc .endif
mov b,a
mov c,l
inr e
.endif:
push b
.skip:
mov a,d
sui 3
mov d,a
jp .loop
pop b
ret
;=======================================================================
использует умножение из той же книжки
Скрытый текст
Код:
;-----------------------------------------------------------------------
; HL = H * E
; BС,E:CONST
;-----------------------------------------------------------------------
umul88 equ gg_u88b1
;-----------------------------------------------------------------------
proc gg_u88b1 ; У88Б1 модифицированная
;-----------------------------------------------------------------------
mvi d,0
mvi l,0
mvi a,8
.loop:
dad h
jnc .skip
dad d
.skip:
dcr a
jnz .loop
ret
;-----------------------------------------------------------------------
endp
[свернуть]
без него не смог, так как портировал данный код из другой известной книжки:
Скрытый текст
Код:
int icbrt(unsigned x){
int s;
unsigned y,b;
s=15;
y=0;
while (s>=0) {
y = 2*y;
b = (3*y*(y+1)+1)<<s;
//b = b & 0xFFFF;
if (x>=b) {
x = x - b;
y = y + 1;
}
s = s - 3;
//printf("x=%6u, y=%6u, b=%6u, s=%2i\n",x,y,b,s);
}
return y;
}
[свернуть]