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