Update MPC library from version 1.0.1 to 1.0.3
[dragonfly.git] / contrib / mpc / src / mpc.h
1 /* mpc.h -- Include file for mpc.
2
3 Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011, 2012, 2014, 2015 INRIA
4
5 This file is part of GNU MPC.
6
7 GNU MPC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU Lesser General Public License as published by the
9 Free Software Foundation; either version 3 of the License, or (at your
10 option) any later version.
11
12 GNU MPC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
15 more details.
16
17 You should have received a copy of the GNU Lesser General Public License
18 along with this program. If not, see http://www.gnu.org/licenses/ .
19 */
20
21 #ifndef __MPC_H
22 #define __MPC_H
23
24 #include "gmp.h"
25 #include "mpfr.h"
26
27 /* Backwards compatibility with mpfr<3.0.0 */
28 #ifndef mpfr_exp_t
29 #define mpfr_exp_t mp_exp_t
30 #endif
31
32 /* Define MPC version number */
33 #define MPC_VERSION_MAJOR 1
34 #define MPC_VERSION_MINOR 0
35 #define MPC_VERSION_PATCHLEVEL 3
36 #define MPC_VERSION_STRING "1.0.3"
37
38 /* Macros dealing with MPC VERSION */
39 #define MPC_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c))
40 #define MPC_VERSION                                                     \
41   MPC_VERSION_NUM(MPC_VERSION_MAJOR,MPC_VERSION_MINOR,MPC_VERSION_PATCHLEVEL)
42
43 /* Check if stdint.h/inttypes.h is included */
44 #if defined (INTMAX_C) && defined (UINTMAX_C)
45 #define _MPC_H_HAVE_INTMAX_T 1
46 #endif
47
48 /* Return values */
49
50 /* Transform negative to 2, positive to 1, leave 0 unchanged */
51 #define MPC_INEX_POS(inex) (((inex) < 0) ? 2 : ((inex) == 0) ? 0 : 1)
52 /* Transform 2 to negative, 1 to positive, leave 0 unchanged */
53 #define MPC_INEX_NEG(inex) (((inex) == 2) ? -1 : ((inex) == 0) ? 0 : 1)
54
55 /* The global inexact flag is made of (real flag) + 4 * (imaginary flag), where
56    each of the real and imaginary inexact flag are:
57    0 when the result is exact (no rounding error)
58    1 when the result is larger than the exact value
59    2 when the result is smaller than the exact value */
60 #define MPC_INEX(inex_re, inex_im) \
61         (MPC_INEX_POS(inex_re) | (MPC_INEX_POS(inex_im) << 2))
62 #define MPC_INEX_RE(inex) MPC_INEX_NEG((inex) & 3)
63 #define MPC_INEX_IM(inex) MPC_INEX_NEG((inex) >> 2)
64
65 /* For functions computing two results, the return value is
66    inexact1+16*inexact2, which is 0 iif both results are exact. */
67 #define MPC_INEX12(inex1, inex2) (inex1 | (inex2 << 4))
68 #define MPC_INEX1(inex) (inex & 15)
69 #define MPC_INEX2(inex) (inex >> 4)
70
71 /* Definition of rounding modes */
72
73 /* a complex rounding mode is just a pair of two real rounding modes
74    we reserve four bits for a real rounding mode.  */
75 typedef int mpc_rnd_t;
76
77 #define MPC_RND(r1,r2) (((int)(r1)) + ((int)(r2) << 4))
78 #define MPC_RND_RE(x) ((mpfr_rnd_t)((x) & 0x0F))
79 #define MPC_RND_IM(x) ((mpfr_rnd_t)((x) >> 4))
80
81 #define MPC_RNDNN MPC_RND (GMP_RNDN,GMP_RNDN)
82 #define MPC_RNDNZ MPC_RND (GMP_RNDN,GMP_RNDZ)
83 #define MPC_RNDNU MPC_RND (GMP_RNDN,GMP_RNDU)
84 #define MPC_RNDND MPC_RND (GMP_RNDN,GMP_RNDD)
85
86 #define MPC_RNDZN MPC_RND (GMP_RNDZ,GMP_RNDN)
87 #define MPC_RNDZZ MPC_RND (GMP_RNDZ,GMP_RNDZ)
88 #define MPC_RNDZU MPC_RND (GMP_RNDZ,GMP_RNDU)
89 #define MPC_RNDZD MPC_RND (GMP_RNDZ,GMP_RNDD)
90
91 #define MPC_RNDUN MPC_RND (GMP_RNDU,GMP_RNDN)
92 #define MPC_RNDUZ MPC_RND (GMP_RNDU,GMP_RNDZ)
93 #define MPC_RNDUU MPC_RND (GMP_RNDU,GMP_RNDU)
94 #define MPC_RNDUD MPC_RND (GMP_RNDU,GMP_RNDD)
95
96 #define MPC_RNDDN MPC_RND (GMP_RNDD,GMP_RNDN)
97 #define MPC_RNDDZ MPC_RND (GMP_RNDD,GMP_RNDZ)
98 #define MPC_RNDDU MPC_RND (GMP_RNDD,GMP_RNDU)
99 #define MPC_RNDDD MPC_RND (GMP_RNDD,GMP_RNDD)
100
101
102 /* Definitions of types and their semantics */
103
104 typedef struct {
105   mpfr_t re;
106   mpfr_t im;
107 }
108 __mpc_struct;
109
110 typedef __mpc_struct mpc_t[1];
111 typedef __mpc_struct *mpc_ptr;
112 typedef const __mpc_struct *mpc_srcptr;
113
114 /* Support for WINDOWS DLL, see
115    http://lists.gforge.inria.fr/pipermail/mpc-discuss/2011-November/000990.html;
116    when building the DLL, export symbols, otherwise behave as GMP           */
117 #if defined (__MPC_LIBRARY_BUILD) && __GMP_LIBGMP_DLL
118 #define __MPC_DECLSPEC __GMP_DECLSPEC_EXPORT
119 #else
120 #define __MPC_DECLSPEC __GMP_DECLSPEC
121 #endif
122
123 #if defined (__cplusplus)
124 extern "C" {
125 #endif
126
127 __MPC_DECLSPEC int  mpc_add       (mpc_ptr, mpc_srcptr, mpc_srcptr, mpc_rnd_t);
128 __MPC_DECLSPEC int  mpc_add_fr    (mpc_ptr, mpc_srcptr, mpfr_srcptr, mpc_rnd_t);
129 __MPC_DECLSPEC int  mpc_add_si    (mpc_ptr, mpc_srcptr, long int, mpc_rnd_t);
130 __MPC_DECLSPEC int  mpc_add_ui    (mpc_ptr, mpc_srcptr, unsigned long int, mpc_rnd_t);
131 __MPC_DECLSPEC int  mpc_sub       (mpc_ptr, mpc_srcptr, mpc_srcptr, mpc_rnd_t);
132 __MPC_DECLSPEC int  mpc_sub_fr    (mpc_ptr, mpc_srcptr, mpfr_srcptr, mpc_rnd_t);
133 __MPC_DECLSPEC int  mpc_fr_sub    (mpc_ptr, mpfr_srcptr, mpc_srcptr, mpc_rnd_t);
134 __MPC_DECLSPEC int  mpc_sub_ui    (mpc_ptr, mpc_srcptr, unsigned long int, mpc_rnd_t);
135 __MPC_DECLSPEC int  mpc_ui_ui_sub (mpc_ptr, unsigned long int, unsigned long int, mpc_srcptr, mpc_rnd_t);
136 __MPC_DECLSPEC int  mpc_mul       (mpc_ptr, mpc_srcptr, mpc_srcptr, mpc_rnd_t);
137 __MPC_DECLSPEC int  mpc_mul_fr    (mpc_ptr, mpc_srcptr, mpfr_srcptr, mpc_rnd_t);
138 __MPC_DECLSPEC int  mpc_mul_ui    (mpc_ptr, mpc_srcptr, unsigned long int, mpc_rnd_t);
139 __MPC_DECLSPEC int  mpc_mul_si    (mpc_ptr, mpc_srcptr, long int, mpc_rnd_t);
140 __MPC_DECLSPEC int  mpc_mul_i     (mpc_ptr, mpc_srcptr, int, mpc_rnd_t);
141 __MPC_DECLSPEC int  mpc_sqr       (mpc_ptr, mpc_srcptr, mpc_rnd_t);
142 __MPC_DECLSPEC int  mpc_div       (mpc_ptr, mpc_srcptr, mpc_srcptr, mpc_rnd_t);
143 __MPC_DECLSPEC int  mpc_pow       (mpc_ptr, mpc_srcptr, mpc_srcptr, mpc_rnd_t);
144 __MPC_DECLSPEC int  mpc_pow_fr    (mpc_ptr, mpc_srcptr, mpfr_srcptr, mpc_rnd_t);
145 __MPC_DECLSPEC int  mpc_pow_ld    (mpc_ptr, mpc_srcptr, long double, mpc_rnd_t);
146 __MPC_DECLSPEC int  mpc_pow_d     (mpc_ptr, mpc_srcptr, double, mpc_rnd_t);
147 __MPC_DECLSPEC int  mpc_pow_si    (mpc_ptr, mpc_srcptr, long, mpc_rnd_t);
148 __MPC_DECLSPEC int  mpc_pow_ui    (mpc_ptr, mpc_srcptr, unsigned long, mpc_rnd_t);
149 __MPC_DECLSPEC int  mpc_pow_z     (mpc_ptr, mpc_srcptr, mpz_srcptr, mpc_rnd_t);
150 __MPC_DECLSPEC int  mpc_div_fr    (mpc_ptr, mpc_srcptr, mpfr_srcptr, mpc_rnd_t);
151 __MPC_DECLSPEC int  mpc_fr_div    (mpc_ptr, mpfr_srcptr, mpc_srcptr, mpc_rnd_t);
152 __MPC_DECLSPEC int  mpc_div_ui    (mpc_ptr, mpc_srcptr, unsigned long int, mpc_rnd_t);
153 __MPC_DECLSPEC int  mpc_ui_div    (mpc_ptr, unsigned long int, mpc_srcptr, mpc_rnd_t);
154 __MPC_DECLSPEC int  mpc_div_2ui   (mpc_ptr, mpc_srcptr, unsigned long int, mpc_rnd_t);
155 __MPC_DECLSPEC int  mpc_mul_2ui   (mpc_ptr, mpc_srcptr, unsigned long int, mpc_rnd_t);
156 __MPC_DECLSPEC int  mpc_div_2si   (mpc_ptr, mpc_srcptr, long int, mpc_rnd_t);
157 __MPC_DECLSPEC int  mpc_mul_2si   (mpc_ptr, mpc_srcptr, long int, mpc_rnd_t);
158 __MPC_DECLSPEC int  mpc_conj      (mpc_ptr, mpc_srcptr, mpc_rnd_t);
159 __MPC_DECLSPEC int  mpc_neg       (mpc_ptr, mpc_srcptr, mpc_rnd_t);
160 __MPC_DECLSPEC int  mpc_norm      (mpfr_ptr, mpc_srcptr, mpfr_rnd_t);
161 __MPC_DECLSPEC int  mpc_abs       (mpfr_ptr, mpc_srcptr, mpfr_rnd_t);
162 __MPC_DECLSPEC int  mpc_sqrt      (mpc_ptr, mpc_srcptr, mpc_rnd_t);
163 __MPC_DECLSPEC int  mpc_set       (mpc_ptr, mpc_srcptr, mpc_rnd_t);
164 __MPC_DECLSPEC int  mpc_set_d     (mpc_ptr, double, mpc_rnd_t);
165 __MPC_DECLSPEC int  mpc_set_d_d   (mpc_ptr, double, double, mpc_rnd_t);
166 __MPC_DECLSPEC int  mpc_set_ld    (mpc_ptr, long double, mpc_rnd_t);
167 __MPC_DECLSPEC int  mpc_set_ld_ld (mpc_ptr, long double, long double, mpc_rnd_t);
168 __MPC_DECLSPEC int  mpc_set_f     (mpc_ptr, mpf_srcptr, mpc_rnd_t);
169 __MPC_DECLSPEC int  mpc_set_f_f   (mpc_ptr, mpf_srcptr, mpf_srcptr, mpc_rnd_t);
170 __MPC_DECLSPEC int  mpc_set_fr    (mpc_ptr, mpfr_srcptr, mpc_rnd_t);
171 __MPC_DECLSPEC int  mpc_set_fr_fr (mpc_ptr, mpfr_srcptr, mpfr_srcptr, mpc_rnd_t);
172 __MPC_DECLSPEC int  mpc_set_q     (mpc_ptr, mpq_srcptr, mpc_rnd_t);
173 __MPC_DECLSPEC int  mpc_set_q_q   (mpc_ptr, mpq_srcptr, mpq_srcptr, mpc_rnd_t);
174 __MPC_DECLSPEC int  mpc_set_si    (mpc_ptr, long int, mpc_rnd_t);
175 __MPC_DECLSPEC int  mpc_set_si_si (mpc_ptr, long int, long int, mpc_rnd_t);
176 __MPC_DECLSPEC int  mpc_set_ui    (mpc_ptr, unsigned long int, mpc_rnd_t);
177 __MPC_DECLSPEC int  mpc_set_ui_ui (mpc_ptr, unsigned long int, unsigned long int, mpc_rnd_t);
178 __MPC_DECLSPEC int  mpc_set_z     (mpc_ptr, mpz_srcptr, mpc_rnd_t);
179 __MPC_DECLSPEC int  mpc_set_z_z   (mpc_ptr, mpz_srcptr, mpz_srcptr, mpc_rnd_t);
180 __MPC_DECLSPEC void mpc_swap      (mpc_ptr, mpc_ptr);
181 __MPC_DECLSPEC int  mpc_fma       (mpc_ptr, mpc_srcptr, mpc_srcptr, mpc_srcptr, mpc_rnd_t);
182
183 __MPC_DECLSPEC void mpc_set_nan   (mpc_ptr);
184
185 __MPC_DECLSPEC int  mpc_real      (mpfr_ptr, mpc_srcptr, mpfr_rnd_t);
186 __MPC_DECLSPEC int  mpc_imag      (mpfr_ptr, mpc_srcptr, mpfr_rnd_t);
187 __MPC_DECLSPEC int  mpc_arg       (mpfr_ptr, mpc_srcptr, mpfr_rnd_t);
188 __MPC_DECLSPEC int  mpc_proj      (mpc_ptr, mpc_srcptr, mpc_rnd_t);
189 __MPC_DECLSPEC int  mpc_cmp       (mpc_srcptr, mpc_srcptr);
190 __MPC_DECLSPEC int  mpc_cmp_si_si (mpc_srcptr, long int, long int);
191 __MPC_DECLSPEC int  mpc_exp       (mpc_ptr, mpc_srcptr, mpc_rnd_t);
192 __MPC_DECLSPEC int  mpc_log       (mpc_ptr, mpc_srcptr, mpc_rnd_t);
193 __MPC_DECLSPEC int  mpc_log10     (mpc_ptr, mpc_srcptr, mpc_rnd_t);
194 __MPC_DECLSPEC int  mpc_sin       (mpc_ptr, mpc_srcptr, mpc_rnd_t);
195 __MPC_DECLSPEC int  mpc_cos       (mpc_ptr, mpc_srcptr, mpc_rnd_t);
196 __MPC_DECLSPEC int  mpc_sin_cos   (mpc_ptr, mpc_ptr, mpc_srcptr, mpc_rnd_t, mpc_rnd_t);
197 __MPC_DECLSPEC int  mpc_tan       (mpc_ptr, mpc_srcptr, mpc_rnd_t);
198 __MPC_DECLSPEC int  mpc_sinh      (mpc_ptr, mpc_srcptr, mpc_rnd_t);
199 __MPC_DECLSPEC int  mpc_cosh      (mpc_ptr, mpc_srcptr, mpc_rnd_t);
200 __MPC_DECLSPEC int  mpc_tanh      (mpc_ptr, mpc_srcptr, mpc_rnd_t);
201 __MPC_DECLSPEC int  mpc_asin      (mpc_ptr, mpc_srcptr, mpc_rnd_t);
202 __MPC_DECLSPEC int  mpc_acos      (mpc_ptr, mpc_srcptr, mpc_rnd_t);
203 __MPC_DECLSPEC int  mpc_atan      (mpc_ptr, mpc_srcptr, mpc_rnd_t);
204 __MPC_DECLSPEC int  mpc_asinh     (mpc_ptr, mpc_srcptr, mpc_rnd_t);
205 __MPC_DECLSPEC int  mpc_acosh     (mpc_ptr, mpc_srcptr, mpc_rnd_t);
206 __MPC_DECLSPEC int  mpc_atanh     (mpc_ptr, mpc_srcptr, mpc_rnd_t);
207 __MPC_DECLSPEC void mpc_clear     (mpc_ptr);
208 __MPC_DECLSPEC int  mpc_urandom   (mpc_ptr, gmp_randstate_t);
209 __MPC_DECLSPEC void mpc_init2     (mpc_ptr, mpfr_prec_t);
210 __MPC_DECLSPEC void mpc_init3     (mpc_ptr, mpfr_prec_t, mpfr_prec_t);
211 __MPC_DECLSPEC mpfr_prec_t mpc_get_prec (mpc_srcptr x);
212 __MPC_DECLSPEC void mpc_get_prec2 (mpfr_prec_t *pr, mpfr_prec_t *pi, mpc_srcptr x);
213 __MPC_DECLSPEC void mpc_set_prec  (mpc_ptr, mpfr_prec_t);
214 __MPC_DECLSPEC const char * mpc_get_version (void);
215
216 __MPC_DECLSPEC int  mpc_strtoc    (mpc_ptr, const char *, char **, int, mpc_rnd_t);
217 __MPC_DECLSPEC int  mpc_set_str   (mpc_ptr, const char *, int, mpc_rnd_t);
218 __MPC_DECLSPEC char * mpc_get_str (int, size_t, mpc_srcptr, mpc_rnd_t);
219 __MPC_DECLSPEC void mpc_free_str  (char *);
220
221 /* declare certain functions only if appropriate headers have been included */
222 #ifdef _MPC_H_HAVE_INTMAX_T
223 __MPC_DECLSPEC int  mpc_set_sj    (mpc_ptr, intmax_t, mpc_rnd_t);
224 __MPC_DECLSPEC int  mpc_set_uj    (mpc_ptr, uintmax_t,  mpc_rnd_t);
225 __MPC_DECLSPEC int  mpc_set_sj_sj (mpc_ptr, intmax_t, intmax_t, mpc_rnd_t);
226 __MPC_DECLSPEC int  mpc_set_uj_uj (mpc_ptr, uintmax_t, uintmax_t, mpc_rnd_t);
227 #endif
228
229 #ifdef _Complex_I
230 __MPC_DECLSPEC int  mpc_set_dc    (mpc_ptr, double _Complex, mpc_rnd_t);
231 __MPC_DECLSPEC int  mpc_set_ldc   (mpc_ptr, long double _Complex, mpc_rnd_t);
232 __MPC_DECLSPEC double _Complex mpc_get_dc (mpc_srcptr, mpc_rnd_t);
233 __MPC_DECLSPEC long double _Complex mpc_get_ldc (mpc_srcptr, mpc_rnd_t);
234 #endif
235
236 #ifdef _GMP_H_HAVE_FILE
237 __MPC_DECLSPEC int mpc_inp_str    (mpc_ptr, FILE *, size_t *, int, mpc_rnd_t);
238 __MPC_DECLSPEC size_t mpc_out_str (FILE *, int, size_t, mpc_srcptr, mpc_rnd_t);
239 #endif
240
241 #if defined (__cplusplus)
242 }
243 #endif
244
245 #define mpc_realref(x) ((x)->re)
246 #define mpc_imagref(x) ((x)->im)
247
248 #define mpc_cmp_si(x, y) \
249  ( mpc_cmp_si_si ((x), (y), 0l) )
250 #define mpc_ui_sub(x, y, z, r) mpc_ui_ui_sub (x, y, 0ul, z, r)
251
252 /*
253    Define a fake mpfr_set_fr so that, for instance, mpc_set_fr_z would
254    be defined as follows:
255    mpc_set_fr_z (mpc_t rop, mpfr_t x, mpz_t y, mpc_rnd_t rnd)
256        MPC_SET_X_Y (fr, z, rop, x, y, rnd)
257 */
258 #ifndef mpfr_set_fr
259 #define mpfr_set_fr mpfr_set
260 #endif
261 #define MPC_SET_X_Y(real_t, imag_t, z, real_value, imag_value, rnd)     \
262   {                                                                     \
263     int _inex_re, _inex_im;                                             \
264     _inex_re = (mpfr_set_ ## real_t) (mpc_realref (z), (real_value), MPC_RND_RE (rnd)); \
265     _inex_im = (mpfr_set_ ## imag_t) (mpc_imagref (z), (imag_value), MPC_RND_IM (rnd)); \
266     return MPC_INEX (_inex_re, _inex_im);                               \
267   }
268
269 #endif /* ifndef __MPC_H */