memory: { Instr1, Instr2, Instr3, Instr4 }

fild [eax] ; put epsilon on stack fild [ebx] ; put x on top of stack fild [ecx] ; put guess (y_0) on top of stack test: fld st(0) ; copy y_i on top of stack again, so that: fmul ; st(0) := y_i ^ 2 fsub st(2) ; st(0) := y_i ^ 2 - x fabs ; fcomp st(3) ; if st(0) < epsilon jc done ; jump to done improve: fld st(0) ; copy y_i fdivr st(2) st(0) ; st(0) := x / y_i fadd ; st(0) := y_i + (x/y_i) fld1 fld1 fadd ; push 2 onto stack fdivr st(1) st(0) ; st(0) := (y_i + (x/y_i))/2 jmp test done: fistp [eax] ; return result fstp st(0) fstp st(0) fstp st(0) ; cleanup

float FindBabylonianSqRoot( float x, float epsilon, float initial = 0 ) {
var guess = Math.Abs(initial);
while( epsilon < Math.Abs(x - guess * guess) ) {
guess = ((x / guess) + guess) / 2.0f;
}
return guess;
}







