|
|
1.1 root 1: /*complex divide, defensive against overflow from
2: * * and /, but not from + and -
3: * assumes underflow yields 0.0
4: * uses identities:
5: * (a + bi)/(c + di) = ((a + bd/c) + (b - ad/c)i)/(c + dd/c)
6: * (a + bi)/(c + di) = (b - ai)/(d - ci)
7: */
8: cdiv(a,b,c,d,u,v)
9: double a,b,c,d;
10: double *u,*v;
11: {
12: double r,t;
13: double fabs();
14: if(fabs(c)<fabs(d)) {
15: t = -c; c = d; d = t;
16: t = -a; a = b; b = t;
17: }
18: r = d/c;
19: t = c + r*d;
20: *u = (a + r*b)/t;
21: *v = (b - r*a)/t;
22: }
23:
24: cmul(c1,c2,d1,d2,e1,e2)
25: double c1,c2,d1,d2;
26: double *e1,*e2;
27: {
28: *e1 = c1*d1 - c2*d2;
29: *e2 = c1*d2 + c2*d1;
30: }
31:
32: csq(c1,c2,e1,e2)
33: double c1,c2;
34: double *e1,*e2;
35: {
36: *e1 = c1*c1 - c2*c2;
37: *e2 = c1*c2*2;
38: }
39:
40: /* complex square root
41: * assumes underflow yields 0.0
42: * uses these identities:
43: * sqrt(x+_iy) = sqrt(r(cos(t)+_isin(t))
44: * = sqrt(r)(cos(t/2)+_isin(t/2))
45: * cos(t/2) = sin(t)/2sin(t/2) = sqrt((1+cos(t)/2)
46: * sin(t/2) = sin(t)/2cos(t/2) = sqrt((1-cos(t)/2)
47: */
48: csqrt(c1,c2,e1,e2)
49: double c1,c2;
50: double *e1,*e2;
51: {
52: double r,s;
53: double x,y;
54: double sqrt(), fabs();
55: x = fabs(c1);
56: y = fabs(c2);
57: if(x>=y) {
58: if(x==0) {
59: *e1 = *e2 = 0;
60: return;
61: }
62: r = x;
63: s = y/x;
64: } else {
65: r = y;
66: s = x/y;
67: }
68: r *= sqrt(1+ s*s);
69: if(c1>0) {
70: *e1 = sqrt((r+c1)/2);
71: *e2 = c2/(2* *e1);
72: } else {
73: *e2 = sqrt((r-c1)/2);
74: if(c2<0)
75: *e2 = -*e2;
76: *e1 = c2/(2* *e2);
77: }
78: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.