|
|
1.1 root 1: /*
2: sqrt returns the square root of its floating
3: point argument. Newton's method.
4:
5: calls frexp
6: */
7:
8: #include <errno.h>
9:
10: int errno;
11: double frexp();
12:
13: double
14: sqrt(arg)
15: double arg;
16: {
17: double x, temp;
18: int exp;
19: int i;
20:
21: if(arg <= 0.) {
22: if(arg < 0.)
23: errno = EDOM;
24: return(0.);
25: }
26: x = frexp(arg,&exp);
27: while(x < 0.5) {
28: x *= 2;
29: exp--;
30: }
31: /*
32: * NOTE
33: * this wont work on 1's comp
34: */
35: if(exp & 1) {
36: x *= 2;
37: exp--;
38: }
39: temp = 0.5*(1.0+x);
40:
41: while(exp > 60) {
42: temp *= (1L<<30);
43: exp -= 60;
44: }
45: while(exp < -60) {
46: temp /= (1L<<30);
47: exp += 60;
48: }
49: if(exp >= 0)
50: temp *= 1L << (exp/2);
51: else
52: temp /= 1L << (-exp/2);
53: for(i=0; i<=4; i++)
54: temp = 0.5*(temp + arg/temp);
55: return(temp);
56: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.