1 #ifndef _GNM_COMPLEX_H_
2 # define _GNM_COMPLEX_H_
5 #include <goffice/goffice.h>
10 #ifdef GNM_WITH_LONG_DOUBLE
11 #define gnm_complex GOComplexl
12 #define gnm_complex_init go_complex_initl
13 #define gnm_complex_add go_complex_addl
14 #define gnm_complex_sub go_complex_subl
15 #define gnm_complex_mul go_complex_mull
16 #define gnm_complex_div go_complex_divl
17 #define gnm_complex_mod go_complex_modl
18 #define gnm_complex_angle go_complex_anglel
19 #define gnm_complex_angle_pi go_complex_angle_pil
20 #define gnm_complex_real go_complex_reall
21 #define gnm_complex_real_p go_complex_real_pl
22 #define gnm_complex_zero_p go_complex_zero_pl
23 #define gnm_complex_conj go_complex_conjl
24 #define gnm_complex_exp go_complex_expl
25 #define gnm_complex_ln go_complex_lnl
26 #define gnm_complex_sqrt go_complex_sqrtl
27 #define gnm_complex_sin go_complex_sinl
28 #define gnm_complex_cos go_complex_cosl
29 #define gnm_complex_tan go_complex_tanl
30 #define gnm_complex_pow go_complex_powl
31 #define gnm_complex_powx go_complex_powxl
32 #define gnm_complex_scale_real go_complex_scale_reall
33 #define gnm_complex_to_polar go_complex_to_polarl
34 #define gnm_complex_from_polar go_complex_from_polarl
35 #define gnm_complex_from_polar_pi go_complex_from_polar_pil
37 #define gnm_complex GOComplex
38 #define gnm_complex_init go_complex_init
39 #define gnm_complex_add go_complex_add
40 #define gnm_complex_sub go_complex_sub
41 #define gnm_complex_mul go_complex_mul
42 #define gnm_complex_div go_complex_div
43 #define gnm_complex_mod go_complex_mod
44 #define gnm_complex_angle go_complex_angle
45 #define gnm_complex_angle_pi go_complex_angle_pi
46 #define gnm_complex_real go_complex_real
47 #define gnm_complex_real_p go_complex_real_p
48 #define gnm_complex_zero_p go_complex_zero_p
49 #define gnm_complex_conj go_complex_conj
50 #define gnm_complex_exp go_complex_exp
51 #define gnm_complex_ln go_complex_ln
52 #define gnm_complex_sqrt go_complex_sqrt
53 #define gnm_complex_sin go_complex_sin
54 #define gnm_complex_cos go_complex_cos
55 #define gnm_complex_tan go_complex_tan
56 #define gnm_complex_pow go_complex_pow
57 #define gnm_complex_powx go_complex_powx
58 #define gnm_complex_scale_real go_complex_scale_real
59 #define gnm_complex_to_polar go_complex_to_polar
60 #define gnm_complex_from_polar go_complex_from_polar
61 #define gnm_complex_from_polar_pi go_complex_from_polar_pi
64 /* ------------------------------------------------------------------------- */
66 char *gnm_complex_to_string (gnm_complex
const *src
, char imunit
);
68 int gnm_complex_from_string (gnm_complex
*dst
, char const *src
, char *imunit
);
70 int gnm_complex_invalid_p (gnm_complex
const *src
);
72 /* ------------------------------------------------------------------------- */
75 static inline gnm_complex
76 gnm_complex_f1_ (void (*f
) (gnm_complex
*, gnm_complex
const *),
84 static inline gnm_complex
85 gnm_complex_f2_ (void (*f
) (gnm_complex
*, gnm_complex
const *, gnm_complex
const *),
86 gnm_complex a1
, gnm_complex a2
)
93 #define GNM_CRE(c) (+(c).re)
94 #define GNM_CIM(c) (+(c).im)
95 static inline gnm_complex
GNM_CMAKE (gnm_float re
, gnm_float im
)
102 #define GNM_CREAL(r) (GNM_CMAKE((r),0))
103 #define GNM_CREALP(c) (GNM_CIM((c)) == 0)
104 #define GNM_CZEROP(c) (GNM_CEQ((c),GNM_C0))
105 #define GNM_C0 (GNM_CREAL (0))
106 #define GNM_C1 (GNM_CREAL (1))
107 #define GNM_CI (GNM_CMAKE (0, 1))
108 #define GNM_CNAN (GNM_CMAKE (gnm_nan, gnm_nan))
110 static inline gboolean
GNM_CEQ(gnm_complex c1
, gnm_complex c2
)
112 return c1
.re
== c2
.re
&& c1
.im
== c2
.im
;
115 static inline gnm_complex
GNM_CPOLAR (gnm_float mod
, gnm_float angle
)
118 gnm_complex_from_polar (&res
, mod
, angle
);
121 static inline gnm_complex
GNM_CPOLARPI (gnm_float mod
, gnm_float angle
)
124 gnm_complex_from_polar_pi (&res
, mod
, angle
);
127 static inline gnm_float
GNM_CARG (gnm_complex c
) { return gnm_complex_angle (&c
); }
128 static inline gnm_float
GNM_CARGPI (gnm_complex c
) { return gnm_complex_angle_pi (&c
); }
129 static inline gnm_float
GNM_CABS (gnm_complex c
) { return gnm_complex_mod (&c
); }
131 #define GNM_CADD(c1,c2) (gnm_complex_f2_ (gnm_complex_add, (c1), (c2)))
132 #define GNM_CSUB(c1,c2) (gnm_complex_f2_ (gnm_complex_sub, (c1), (c2)))
133 #define GNM_CMUL(c1,c2) (gnm_complex_f2_ (gnm_complex_mul, (c1), (c2)))
134 #define GNM_CMUL3(c1,c2,c3) GNM_CMUL(GNM_CMUL(c1,c2),c3)
135 #define GNM_CMUL4(c1,c2,c3,c4) GNM_CMUL(GNM_CMUL(GNM_CMUL(c1,c2),c3),c4)
136 #define GNM_CDIV(c1,c2) (gnm_complex_f2_ (gnm_complex_div, (c1), (c2)))
137 #define GNM_CPOW(c1,c2) (gnm_complex_f2_ (gnm_complex_pow, (c1), (c2)))
138 static inline gnm_complex
GNM_CPOWX(gnm_complex c1
, gnm_complex c2
, gnm_float
*e
)
141 gnm_complex_powx (&res
, e
, &c1
, &c2
);
145 #define GNM_CCONJ(c1) (gnm_complex_f1_ (gnm_complex_conj, (c1)))
146 #define GNM_CSQRT(c1) (gnm_complex_f1_ (gnm_complex_sqrt, (c1)))
147 #define GNM_CEXP(c1) (gnm_complex_f1_ (gnm_complex_exp, (c1)))
148 #define GNM_CLN(c1) (gnm_complex_f1_ (gnm_complex_ln, (c1)))
149 #define GNM_CSIN(c1) (gnm_complex_f1_ (gnm_complex_sin, (c1)))
150 #define GNM_CCOS(c1) (gnm_complex_f1_ (gnm_complex_cos, (c1)))
151 #define GNM_CTAN(c1) (gnm_complex_f1_ (gnm_complex_tan, (c1)))
152 #define GNM_CINV(c1) (GNM_CDIV (GNM_C1, (c1)))
153 static inline gnm_complex
GNM_CNEG(gnm_complex c
)
155 return GNM_CMAKE (-c
.re
, -c
.im
);
158 static inline gnm_complex
GNM_CSCALE(gnm_complex c
, gnm_float s
)
160 return GNM_CMAKE (c
.re
* s
, c
.im
* s
);
162 static inline gnm_complex
GNM_CLDEXP(gnm_complex c
, gnm_float e
)
164 int ie
= (int)CLAMP (e
, G_MININT
, G_MAXINT
);
165 return GNM_CMAKE (gnm_ldexp (c
.re
, ie
), gnm_ldexp (c
.im
, ie
));
168 static inline gnm_complex
GNM_CEXPPI(gnm_complex c
)
170 return GNM_CPOLARPI (gnm_exp (c
.re
), c
.im
);
173 /* ------------------------------------------------------------------------- */
177 #endif /* _GNM_COMPLEX_H_ */