Hi to all!
I'm writing an assembly program that at a certain point calculates a square root, then it has to verify if the result is an integer (i.e. 2.000) or a "true" floating point number (i.e. 2.456).
How can I do this in Assembly language?
P.S.
The next week I have to take an exam about this kind of things, I hope you can help me.
Comments
Example: you calculate root of value 4 and as a result of the algorithm you get back the value of 2.00000000000783. Then, by performing the TRUNCATE - you get back the fractional part as: 0.00000000000783 - now you need to check it for zero and the check will say: NOT ZERO. Advice: you need to check for zero using some kind of range, like [-.000000000000005 .. +.000000000000005] and if your fractional part is in that range - then you got a zero fractional part and your result is a whole value.
With all that said - in reality it is impossible to resolve such situation because of FPU final precision - it has 80 bits to operate on and it is always possible to lose bits during calculations.[/color]
;this doesn't use the fpu but is still quite slow
someFunction:
xor ax,ax
tryAgain:
mov bx,ax
inc ax
push ax
xor dx,dx
mul ax
cmp ax,value ; your value (pre-square root)
pop ax
jb tryAgain
je perfectMatch
;here AX*AX > value > BX*BX
;in other words: AX > sqrt(value) > BX
;and AX = BX + 1
;therefore root is non-integer "true" floating point
ret
perfectMatch:
;AX = root (which is an integer)
ret
[/code]
"The next week I have to take an exam about this"
Sorry I was late... hope you did well on it...