4
static cdouble nc_1 = {1., 0.};
5
static cdouble nc_half = {0.5, 0.};
6
static cdouble nc_i = {0., 1.};
7
static cdouble nc_i2 = {0., 0.5};
9
static cdouble nc_mi = {0., -1.};
10
static cdouble nc_pi2 = {M_PI/2., 0.};
14
nc_sum(cdouble *a, cdouble *b, cdouble *r)
16
r->real = a->real + b->real;
17
r->imag = a->imag + b->imag;
22
nc_diff(cdouble *a, cdouble *b, cdouble *r)
24
r->real = a->real - b->real;
25
r->imag = a->imag - b->imag;
30
nc_neg(cdouble *a, cdouble *r)
38
nc_prod(cdouble *a, cdouble *b, cdouble *r)
40
double ar=a->real, br=b->real, ai=a->imag, bi=b->imag;
41
r->real = ar*br - ai*bi;
42
r->imag = ar*bi + ai*br;
47
nc_quot(cdouble *a, cdouble *b, cdouble *r)
50
double ar=a->real, br=b->real, ai=a->imag, bi=b->imag;
51
double d = br*br + bi*bi;
52
r->real = (ar*br + ai*bi)/d;
53
r->imag = (ai*br - ar*bi)/d;
58
nc_floor_quot(cdouble *a, cdouble *b, cdouble *r)
60
double ar=a->real, br=b->real, ai=a->imag, bi=b->imag;
61
double d = br*br + bi*bi;
62
r->real = floor((ar*br + ai*bi)/d);
68
nc_sqrt(cdouble *x, cdouble *r)
71
if (x->real == 0. && x->imag == 0.)
74
s = sqrt(0.5*(fabs(x->real) + hypot(x->real,x->imag)));
80
else if (x->imag >= 0.) {
93
nc_log(cdouble *x, cdouble *r)
95
double l = hypot(x->real,x->imag);
96
r->imag = atan2(x->imag, x->real);
102
nc_log1p(cdouble *x, cdouble *r)
104
double l = hypot(x->real + 1.0,x->imag);
105
r->imag = atan2(x->imag, x->real + 1.0);
111
nc_exp(cdouble *x, cdouble *r)
113
double a = exp(x->real);
114
r->real = a*cos(x->imag);
115
r->imag = a*sin(x->imag);
120
nc_expm1(cdouble *x, cdouble *r)
122
double a = exp(x->real);
123
r->real = a*cos(x->imag) - 1.0;
124
r->imag = a*sin(x->imag);
129
nc_pow(cdouble *a, cdouble *b, cdouble *r)
132
double ar=a->real, br=b->real, ai=a->imag, bi=b->imag;
134
if (br == 0. && bi == 0.) {
139
if (ar == 0. && ai == 0.) {
144
if (bi == 0 && (n=(intp)br) == br) {
145
if (n > -100 && n < 100) {
150
p.real = ar; p.imag = ai;
155
if (n < mask || mask <= 0) break;
158
r->real = aa.real; r->imag = aa.imag;
159
if (br < 0) nc_quot(&nc_1, r, r);
163
/* complexobect.c uses an inline version of this formula
164
investigate whether this had better performance or accuracy */
173
nc_prodi(cdouble *x, cdouble *r)
182
nc_acos(cdouble *x, cdouble *r)
185
nc_diff(&nc_1, r, r);
193
/* return nc_neg(nc_prodi(nc_log(nc_sum(x,nc_prod(nc_i,
194
nc_sqrt(nc_diff(nc_1,nc_prod(x,x))))))));
199
nc_acosh(cdouble *x, cdouble *r)
202
nc_diff(&nc_1, r, r);
209
return nc_log(nc_sum(x,nc_prod(nc_i,
210
nc_sqrt(nc_diff(nc_1,nc_prod(x,x))))));
215
nc_asin(cdouble *x, cdouble *r)
219
nc_diff(&nc_1, r, r);
228
return nc_neg(nc_prodi(nc_log(nc_sum(nc_prod(nc_i,x),
229
nc_sqrt(nc_diff(nc_1,nc_prod(x,x)))))));
235
nc_asinh(cdouble *x, cdouble *r)
245
return nc_neg(nc_log(nc_diff(nc_sqrt(nc_sum(nc_1,nc_prod(x,x))),x)));
250
nc_atan(cdouble *x, cdouble *r)
253
nc_diff(&nc_i, x, pa);
257
nc_prod(&nc_i2, r, r);
260
return nc_prod(nc_i2,nc_log(nc_quot(nc_sum(nc_i,x),nc_diff(nc_i,x))));
265
nc_atanh(cdouble *x, cdouble *r)
268
nc_diff(&nc_1, x, r);
269
nc_sum(&nc_1, x, pa);
272
nc_prod(&nc_half, r, r);
275
return nc_prod(nc_half,nc_log(nc_quot(nc_sum(nc_1,x),nc_diff(nc_1,x))));
280
nc_cos(cdouble *x, cdouble *r)
282
double xr=x->real, xi=x->imag;
283
r->real = cos(xr)*cosh(xi);
284
r->imag = -sin(xr)*sinh(xi);
289
nc_cosh(cdouble *x, cdouble *r)
291
double xr=x->real, xi=x->imag;
292
r->real = cos(xi)*cosh(xr);
293
r->imag = sin(xi)*sinh(xr);
298
#define M_LOG10_E 0.434294481903251827651128918916605082294397
301
nc_log10(cdouble *x, cdouble *r)
304
r->real *= M_LOG10_E;
305
r->imag *= M_LOG10_E;
310
nc_sin(cdouble *x, cdouble *r)
312
double xr=x->real, xi=x->imag;
313
r->real = sin(xr)*cosh(xi);
314
r->imag = cos(xr)*sinh(xi);
319
nc_sinh(cdouble *x, cdouble *r)
321
double xr=x->real, xi=x->imag;
322
r->real = cos(xi)*sinh(xr);
323
r->imag = sin(xi)*cosh(xr);
328
nc_tan(cdouble *x, cdouble *r)
330
double sr,cr,shi,chi;
333
double xr=x->real, xi=x->imag;
343
r->real = (rs*rc+is*ic)/d;
344
r->imag = (is*rc-rs*ic)/d;
349
nc_tanh(cdouble *x, cdouble *r)
351
double si,ci,shr,chr;
354
double xr=x->real, xi=x->imag;
364
r->real = (rs*rc+is*ic)/d;
365
r->imag = (is*rc-rs*ic)/d;