home *** CD-ROM | disk | FTP | other *** search
/ RISC DISC 3 / RISC_DISC_3.iso / resources / etexts / gems / gemsv / ch1_3 / fixsqrt.c
Text File  |  1995-03-04  |  855b  |  28 lines

  1. /* The definitions below yield 2 integer bits, 30 fractional bits */
  2. #define FRACBITS 30    /* Must be even! */
  3. #define ITERS    (15 + (FRACBITS >> 1))
  4. typedef long TFract;
  5.  
  6. TFract
  7. FFracSqrt(TFract x)
  8. {
  9.     register unsigned long root, remHi, remLo, testDiv, count;
  10.  
  11.     root = 0;         /* Clear root */
  12.     remHi = 0;        /* Clear high part of partial remainder */
  13.     remLo = x;        /* Get argument into low part of partial remainder */
  14.     count = ITERS;    /* Load loop counter */
  15.  
  16.     do {
  17.         remHi = (remHi << 2) | (remLo >> 30); remLo <<= 2;  /* get 2 bits of arg */
  18.         root <<= 1;   /* Get ready for the next bit in the root */
  19.         testDiv = (root << 1) + 1;    /* Test radical */
  20.         if (remHi >= testDiv) {
  21.             remHi -= testDiv;
  22.             root += 1;
  23.         }
  24.     } while (count-- != 0);
  25.  
  26.     return(root);
  27. }
  28.