Update Spanish translation
[gnumeric.git] / src / complex.h
blob9a0a40f8b65007604fe47fa8f3a5122ff42e551c
1 #ifndef _GNM_COMPLEX_H_
2 # define _GNM_COMPLEX_H_
4 #include <numbers.h>
5 #include <goffice/goffice.h>
6 #include <math.h>
8 G_BEGIN_DECLS
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
36 #else
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
62 #endif
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 /* ------------------------------------------------------------------------- */
73 // Value interface
75 static inline gnm_complex
76 gnm_complex_f1_ (void (*f) (gnm_complex *, gnm_complex const *),
77 gnm_complex a1)
79 gnm_complex res;
80 f (&res, &a1);
81 return res;
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)
88 gnm_complex res;
89 f (&res, &a1, &a2);
90 return res;
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)
97 gnm_complex res;
98 res.re = re;
99 res.im = im;
100 return res;
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)
117 gnm_complex res;
118 gnm_complex_from_polar (&res, mod, angle);
119 return res;
121 static inline gnm_complex GNM_CPOLARPI (gnm_float mod, gnm_float angle)
123 gnm_complex res;
124 gnm_complex_from_polar_pi (&res, mod, angle);
125 return res;
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)
140 gnm_complex res;
141 gnm_complex_powx (&res, e, &c1, &c2);
142 return res;
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 /* ------------------------------------------------------------------------- */
175 G_END_DECLS
177 #endif /* _GNM_COMPLEX_H_ */