1 /* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2 #ifndef _GNM_COMPLEX_H_
3 # define _GNM_COMPLEX_H_
6 #include <goffice/goffice.h>
11 #ifdef GNM_WITH_LONG_DOUBLE
12 #define gnm_complex GOComplexl
13 #define gnm_complex_init go_complex_initl
14 #define gnm_complex_add go_complex_addl
15 #define gnm_complex_sub go_complex_subl
16 #define gnm_complex_mul go_complex_mull
17 #define gnm_complex_div go_complex_divl
18 #define gnm_complex_mod go_complex_modl
19 #define gnm_complex_angle go_complex_anglel
20 #define gnm_complex_angle_pi go_complex_angle_pil
21 #define gnm_complex_real go_complex_reall
22 #define gnm_complex_real_p go_complex_real_pl
23 #define gnm_complex_zero_p go_complex_zero_pl
24 #define gnm_complex_conj go_complex_conjl
25 #define gnm_complex_exp go_complex_expl
26 #define gnm_complex_ln go_complex_lnl
27 #define gnm_complex_sqrt go_complex_sqrtl
28 #define gnm_complex_sin go_complex_sinl
29 #define gnm_complex_cos go_complex_cosl
30 #define gnm_complex_tan go_complex_tanl
31 #define gnm_complex_pow go_complex_powl
32 #define gnm_complex_powx go_complex_powxl
33 #define gnm_complex_scale_real go_complex_scale_reall
34 #define gnm_complex_to_polar go_complex_to_polarl
35 #define gnm_complex_from_polar go_complex_from_polarl
36 #define gnm_complex_from_polar_pi go_complex_from_polar_pil
38 #define gnm_complex GOComplex
39 #define gnm_complex_init go_complex_init
40 #define gnm_complex_add go_complex_add
41 #define gnm_complex_sub go_complex_sub
42 #define gnm_complex_mul go_complex_mul
43 #define gnm_complex_div go_complex_div
44 #define gnm_complex_mod go_complex_mod
45 #define gnm_complex_angle go_complex_angle
46 #define gnm_complex_angle_pi go_complex_angle_pi
47 #define gnm_complex_real go_complex_real
48 #define gnm_complex_real_p go_complex_real_p
49 #define gnm_complex_zero_p go_complex_zero_p
50 #define gnm_complex_conj go_complex_conj
51 #define gnm_complex_exp go_complex_exp
52 #define gnm_complex_ln go_complex_ln
53 #define gnm_complex_sqrt go_complex_sqrt
54 #define gnm_complex_sin go_complex_sin
55 #define gnm_complex_cos go_complex_cos
56 #define gnm_complex_tan go_complex_tan
57 #define gnm_complex_pow go_complex_pow
58 #define gnm_complex_powx go_complex_powx
59 #define gnm_complex_scale_real go_complex_scale_real
60 #define gnm_complex_to_polar go_complex_to_polar
61 #define gnm_complex_from_polar go_complex_from_polar
62 #define gnm_complex_from_polar_pi go_complex_from_polar_pi
65 /* ------------------------------------------------------------------------- */
67 char *gnm_complex_to_string (gnm_complex
const *src
, char imunit
);
69 int gnm_complex_from_string (gnm_complex
*dst
, char const *src
, char *imunit
);
71 int gnm_complex_invalid_p (gnm_complex
const *src
);
73 /* ------------------------------------------------------------------------- */
76 static inline gnm_complex
77 gnm_complex_f1_ (void (*f
) (gnm_complex
*, gnm_complex
const *),
85 static inline gnm_complex
86 gnm_complex_f2_ (void (*f
) (gnm_complex
*, gnm_complex
const *, gnm_complex
const *),
87 gnm_complex a1
, gnm_complex a2
)
94 #define GNM_CRE(c) (+(c).re)
95 #define GNM_CIM(c) (+(c).im)
96 static inline gnm_complex
GNM_CMAKE (gnm_float re
, gnm_float im
)
103 #define GNM_CREAL(r) (GNM_CMAKE((r),0))
104 #define GNM_CREALP(c) (GNM_CIM((c)) == 0)
105 #define GNM_CZEROP(c) (GNM_CEQ((c),GNM_C0))
106 #define GNM_C0 (GNM_CREAL (0))
107 #define GNM_C1 (GNM_CREAL (1))
108 #define GNM_CI (GNM_CMAKE (0, 1))
109 #define GNM_CNAN (GNM_CMAKE (gnm_nan, gnm_nan))
111 static inline gboolean
GNM_CEQ(gnm_complex c1
, gnm_complex c2
)
113 return c1
.re
== c2
.re
&& c1
.im
== c2
.im
;
116 static inline gnm_complex
GNM_CPOLAR (gnm_float mod
, gnm_float angle
)
119 gnm_complex_from_polar (&res
, mod
, angle
);
122 static inline gnm_complex
GNM_CPOLARPI (gnm_float mod
, gnm_float angle
)
125 gnm_complex_from_polar_pi (&res
, mod
, angle
);
128 static inline gnm_float
GNM_CARG (gnm_complex c
) { return gnm_complex_angle (&c
); }
129 static inline gnm_float
GNM_CARGPI (gnm_complex c
) { return gnm_complex_angle_pi (&c
); }
130 static inline gnm_float
GNM_CABS (gnm_complex c
) { return gnm_complex_mod (&c
); }
132 #define GNM_CADD(c1,c2) (gnm_complex_f2_ (gnm_complex_add, (c1), (c2)))
133 #define GNM_CSUB(c1,c2) (gnm_complex_f2_ (gnm_complex_sub, (c1), (c2)))
134 #define GNM_CMUL(c1,c2) (gnm_complex_f2_ (gnm_complex_mul, (c1), (c2)))
135 #define GNM_CMUL3(c1,c2,c3) GNM_CMUL(GNM_CMUL(c1,c2),c3)
136 #define GNM_CMUL4(c1,c2,c3,c4) GNM_CMUL(GNM_CMUL(GNM_CMUL(c1,c2),c3),c4)
137 #define GNM_CDIV(c1,c2) (gnm_complex_f2_ (gnm_complex_div, (c1), (c2)))
138 #define GNM_CPOW(c1,c2) (gnm_complex_f2_ (gnm_complex_pow, (c1), (c2)))
139 static inline gnm_complex
GNM_CPOWX(gnm_complex c1
, gnm_complex c2
, gnm_float
*e
)
142 gnm_complex_powx (&res
, e
, &c1
, &c2
);
146 #define GNM_CCONJ(c1) (gnm_complex_f1_ (gnm_complex_conj, (c1)))
147 #define GNM_CSQRT(c1) (gnm_complex_f1_ (gnm_complex_sqrt, (c1)))
148 #define GNM_CEXP(c1) (gnm_complex_f1_ (gnm_complex_exp, (c1)))
149 #define GNM_CLN(c1) (gnm_complex_f1_ (gnm_complex_ln, (c1)))
150 #define GNM_CSIN(c1) (gnm_complex_f1_ (gnm_complex_sin, (c1)))
151 #define GNM_CCOS(c1) (gnm_complex_f1_ (gnm_complex_cos, (c1)))
152 #define GNM_CTAN(c1) (gnm_complex_f1_ (gnm_complex_tan, (c1)))
153 #define GNM_CINV(c1) (GNM_CDIV (GNM_C1, (c1)))
154 static inline gnm_complex
GNM_CNEG(gnm_complex c
)
156 return GNM_CMAKE (-c
.re
, -c
.im
);
159 static inline gnm_complex
GNM_CSCALE(gnm_complex c
, gnm_float s
)
161 return GNM_CMAKE (c
.re
* s
, c
.im
* s
);
163 static inline gnm_complex
GNM_CLDEXP(gnm_complex c
, gnm_float e
)
165 int ie
= (int)CLAMP (e
, G_MININT
, G_MAXINT
);
166 return GNM_CMAKE (gnm_ldexp (c
.re
, ie
), gnm_ldexp (c
.im
, ie
));
169 static inline gnm_complex
GNM_CEXPPI(gnm_complex c
)
171 return GNM_CPOLARPI (gnm_exp (c
.re
), c
.im
);
174 /* ------------------------------------------------------------------------- */
178 #endif /* _GNM_COMPLEX_H_ */