/*
***********************************************************************
*
* Copyright (C) 1999 Ericsson Radio Systems AB
* 
* The Association of Radio Industries and Businesses (ARIB) has the
* licence to reproduce, distribute and publish the Bit Exact C Code
* programs in this CD-ROM together with the other parts of the RCR
* STD-27 (Personal Digital Cellular Telecommunication System)
* specification.
* 
* Ericsson has declared Option 1 (royalty-free licence) to ARIB for
* its Essential Industrial Property Rights related to the ACELP
* specification and the Bit Exact C Code programs. The royalty-free
* licence is limited to the development and manufacturing of
* products complying with the RCR STD-27H specification (or
* subsequent versions) for sale and use in Japan. Copying of the
* program(s) for any other purpose requires the prior written
* permission from Ericsson.
* 
* The user of the Bit Exact C Code hereby acknowledges the
* following:
* 
* 1.  Ericsson does not provide the user with any warranties,
*     whether express or implied, including but not limited to
*     warranties of merchantability and fitness for a particular
*     purpose relating to the Bit Exact C Code.
* 
* 2.  Ericsson shall have no responsibility whatsoever to indemnify
*     the user against actions or claims for infringement of any
*     intellectual property rights, e.g. patents, copyrights,
*     registered designs or any other rights, by reason of the
*     user's use of the Bit Exact C Code.
* 
***********************************************************************
*/

/*************************************************************************
 *
 *   FUNCTION:  sqrt_s()
 *
 *   PURPOSE: square root function, input in Q15, output in Q15
 *
 *   DESCRIPTION:
 *       
 *       
 *
 *************************************************************************/
#include <stdio.h>
#include "typedef.h"
#include "basic_op.h"
#include "cnst.h"

Word16 sqrt_s(
   Word16 x
)
{
   Word16 i;
   Word16 root = 0;
   Word16 guess = 16384;
   Word16 temp = 16384;
   Word32 L_acc, L_preg;

   if (x < 0) {
      fprintf(stderr,"ifsqrt: Negative value\n");
   }

   L_preg = L_shl(x,16);

   for (i = 0; i < 16; i++) {
      L_acc = L_mult(temp,temp); 
      L_acc = L_sub(L_preg,L_acc);
      if (L_acc > 0)
         root = temp;
      guess = shr(guess,1); /* guess DIV 2 */
      temp = add(guess,root); /* guess + root */
   }
   return root;   
}
