Difference between revisions of "Z80 Routines:Math:Logarithm"

From WikiTI
Jump to: navigation, search
m (fix formatting)
 
Line 10: Line 10:
 
; output: a = log2(hl) (rounded down and from -1 to 15) (8-bit integer signed)
 
; output: a = log2(hl) (rounded down and from -1 to 15) (8-bit integer signed)
 
log2:
 
log2:
ld a,h
+
ld a,16
or l
+
scf
ld a,-1
+
ret z    ; return -1 if hl=0
+
ld b,15  ; logarithm in base 2 is the number of significant bits for a integer, i.e. number of bits after the first 1 including it
+
 
log2loop:
 
log2loop:
add hl,hl
+
adc hl,hl
jr c,log2end
+
dec a
djnz log2loop
+
jr nc,log2loop
log2end:
+
ld a,b
+
 
ret
 
ret
 
  </nowiki>
 
  </nowiki>

Latest revision as of 12:32, 17 June 2010


Introduction

Integer Log of base 2

; input: hl (16-bit integer unsigned)
; output: a = log2(hl) (rounded down and from -1 to 15) (8-bit integer signed)
log2:
	ld	a,16
	scf
log2loop:
	adc	hl,hl
	dec	a
	jr	nc,log2loop
	ret
 

Integer Log of base 10

Since log10=log2(hl)/log2(10). We can multiply by 1/log2(10).


 

Integer Log of base B

The same trick as above.

;unfinished
logB:
; input: hl = number
;	 b = base
; output: a = log hl base b
	
	ret