/* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* $Header $ */ /* Author: J.W. Stevenson */ extern double _fef(); /* sqrt returns the square root of its floating point argument. Newton's method. calls _fef */ double _sqt(arg) double arg; { double x, temp; int exp; int i; if(arg <= 0) { if(arg < 0) error(3); return(0); } x = _fef(arg,&exp); /* while(x < 0.5) { x =* 2; exp--; } */ /* * NOTE * this wont work on 1's comp */ if(exp & 1) { x *= 2; exp--; } temp = 0.5*(1 + x); while(exp > 28) { temp *= (1<<14); exp -= 28; } while(exp < -28) { temp /= (1<<14); exp += 28; } if(exp >= 0) temp *= 1 << (exp/2); else temp /= 1 << (-exp/2); for(i=0; i<=4; i++) temp = 0.5*(temp + arg/temp); return(temp); }