SQRT-Routine from Bob Price (see EMail
Addresses)
Captured from a message in a public CompuServe Forum
/* ------------------------------------------------------------------ */
/* REXX exec to calculate a square root using an optimized */
/* version of the ever-popular Newton-Raphson method. */
/* Alter numeric digits for desired level of precision. */
/* */
/* Author: Bob Price */
/**********************************************************************/
numeric digits 21
do forever
call CharOut, "Enter a number (RETURN to exit): "
thisNumber = strip( lineIN() )
select
when thisNumber = "" then
leave
when datatype( thisNumber ) <> "NUM" then
say "Invalid response!"
when thisNumber <= 0 then
say "Invalid number!"
otherwise
do
thisSqrt = SQRT( thisNumber )
Say " The Square root of " || thisNumber || " is " || thisSqrt
Say " Controlvalue: "
Say " " || thisSqrt "*" thisSqrt "=" thisSqrt*thisSqrt
end /* otherwise */
end /* select */
end /* do forever */
exit 0
/* ------------------------------------------------------------------ */
/* function: calculate the square root of a number */
/* */
/* call: Sqrt number */
/* */
/* where: number - number to calculate the square root of */
/* */
/* returns: the square root */
/* */
SQRT: PROCEDURE
ARG n
/* ans, the "answer", will be brought to the square root by */
/* successive approximation. */
ans = n / 2 /* initial guess at an answer */
prevans = n /* "previous answer" */
do until prevans = ans /* i.e., no more improvement is found */
prevans = ans /* save previous answer */
ans = ( prevans + ( n / prevans ) ) / 2
end
return ans