2 / 1 = 2 (2 + 1) / 2 = 1.5 2 / 1.5 = 1.333333 (1.333333 + 1.5) / 2 = 1.4167 2 / 1.4167 = 1.4118 ( 1.4167 / 1.4118 ) / 2 = 1.4142 etc. The more times you perform the above procedure, the more accurate your answer. #### #!/usr/bin/perl -w use strict; while () { # GET INPUT FROM COMMAND LINE chomp; $_ > 0 && ( /^\d*\.\d+$/ ) && last; # ASK AGAIN UNLESS VALID INPUT GIVEN print "Please enter a positive number only!\n"; } sqroot(1, $_); # PASS INITIAL GUESS OF '1' AND RADICAND TO SQROOT SUB sub sqroot { my ($guess, $x) = @_; while ( get_accuracy($guess, new_guess($guess, $x)) > .000000000000000001) { # CHECK DIFFERENCE BETWEEN OLD GUESS AND NEW GUESS $guess = new_guess($guess, $x); # MAKE OLD GUESS THE NEW GUESS AND RUN WHILE LOOP AGAIN } print $guess; # PRINT GUESS IF (OLD GUESS - NEW GUESS) IS VERY CLOSE } sub new_guess { # REFINE THE OLD GUESS TO MAKE MORE ACCURATE my ($guess, $x) = @_; my $x_div_guess = $x / $guess; # DIVIDE RADICAND BY OLD GUESS return ($guess + $x_div_guess) / 2; # RETURN, AS NEW GUESS, THE AVERAGE OF OLD GUESS AND RADICAND DIVIDED BY OLD GUESS } sub get_accuracy { my ($guess, $newguess) = @_; return (abs ($guess - $newguess)); # COMPARES HOW CLOSE OLD GUESS AND NEW GUESS ARE }