// ---------------------------------------------------- // Integer and FP sqrt routines,with test driver. // // Copyright 2005,2006, Mike Noel, All Rights Reserved // ---------------------------------------------------- #include #include #include "nFP.tea" #define HowMany 12 // ********************* Integer Routine ******************** int I_sqrt (int num) { int i, atest; if (num < 0) return (-1); for (i=0, atest = num / 2; i<9; i++) { if (atest < 1) return (atest); atest = ((num / atest) + atest) / 2; } return (atest); } // ************************ FP Routine ********************** int FP_sqrt (int num, char exp) { int newa, olda; char newax, oldax; // initial tests for valid input if (num < 0) return (-1); if (num == 0) { nFP_mant = 0; return (0); } // first approx - 1 (one) newa = 16384; newax = -14; // successive approx - use new = 0.5 * (old + (num / old)) // quit when newax = oldax and abs(newa-olda)<10) // remember newa and olda are normalize mantissa, // so they are in the range 16k-32k and "<10" means // within a 1/10 of a percent... do { olda = newa; oldax = newax; nFP_reciprocal(olda, oldax); if (nFP_error != nFP_err_none) return(-1); nFP_multiply(nFP_mant, nFP_exp, num, exp); if (nFP_error != nFP_err_none) return(-1); nFP_add(nFP_mant, nFP_exp, olda, oldax); if (nFP_error != nFP_err_none) return(-1); nFP_exp--; // quick divide by 2... newa = nFP_mant; newax = nFP_exp; } while ((oldax != newax) || (nFP_intabsval(olda-newa)>10)); return (newa); } // ******************* Test driver Routine ****************** void main () { // int i=0, r=0, s=0; // Print sign on message aPrint_String("Test sqrt functions\n"); // Print sign on message aPrint_String("Test integer sqrt\n"); for (i=0; i