1 /* mpc.h -- Include file for mpc.
3 Copyright (C) INRIA, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011
5 This file is part of the MPC Library.
7 The MPC Library is free software; you can redistribute it and/or modify
8 it under the terms of the GNU Lesser General Public License as published by
9 the Free Software Foundation; either version 2.1 of the License, or (at your
10 option) any later version.
12 The MPC Library is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
15 License for more details.
17 You should have received a copy of the GNU Lesser General Public License
18 along with the MPC Library; see the file COPYING.LIB. If not, write to
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
20 MA 02111-1307, USA. */
28 /* Backwards compatibility with mpfr<3.0.0 */
30 #define mpfr_exp_t mp_exp_t
33 /* Define MPC version number */
34 #define MPC_VERSION_MAJOR 0
35 #define MPC_VERSION_MINOR 9
36 #define MPC_VERSION_PATCHLEVEL 0
37 #define MPC_VERSION_STRING "0.9"
39 /* Macros dealing with MPC VERSION */
40 #define MPC_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c))
42 MPC_VERSION_NUM(MPC_VERSION_MAJOR,MPC_VERSION_MINOR,MPC_VERSION_PATCHLEVEL)
44 /* Check if stdio.h is included */
45 #if defined (_GMP_H_HAVE_FILE)
46 # define _MPC_H_HAVE_FILE 1
49 /* Check if stdint.h/inttypes.h is included */
50 #if defined (INTMAX_C) && defined (UINTMAX_C)
51 # define _MPC_H_HAVE_INTMAX_T 1
54 /* Check if complex.h is included */
55 #if defined (_COMPLEX_H)
56 # define _MPC_H_HAVE_COMPLEX 1
61 /* Transform negative to 2, positive to 1, leave 0 unchanged */
62 #define MPC_INEX_POS(inex) (((inex) < 0) ? 2 : ((inex) == 0) ? 0 : 1)
63 /* Transform 2 to negative, 1 to positive, leave 0 unchanged */
64 #define MPC_INEX_NEG(inex) (((inex) == 2) ? -1 : ((inex) == 0) ? 0 : 1)
66 /* The global inexact flag is made of (real flag) + 4 * (imaginary flag), where
67 each of the real and imaginary inexact flag are:
68 0 when the result is exact (no rounding error)
69 1 when the result is larger than the exact value
70 2 when the result is smaller than the exact value */
71 #define MPC_INEX(inex_re, inex_im) \
72 (MPC_INEX_POS(inex_re) | (MPC_INEX_POS(inex_im) << 2))
73 #define MPC_INEX_RE(inex) MPC_INEX_NEG((inex) & 3)
74 #define MPC_INEX_IM(inex) MPC_INEX_NEG((inex) >> 2)
76 /* For functions computing two results, the return value is
77 inexact1+16*inexact2, which is 0 iif both results are exact. */
78 #define MPC_INEX12(inex1, inex2) (inex1 | (inex2 << 4))
79 #define MPC_INEX1(inex) (inex & 15)
80 #define MPC_INEX2(inex) (inex >> 4)
82 /* Definition of rounding modes */
84 /* a complex rounding mode is just a pair of two real rounding modes
85 we reserve four bits for a real rounding mode. */
86 typedef int mpc_rnd_t
;
88 #define RNDC(r1,r2) (((int)(r1)) + ((int)(r2) << 4))
89 #define MPC_RND_RE(x) ((mpfr_rnd_t)((x) & 0x0F))
90 #define MPC_RND_IM(x) ((mpfr_rnd_t)((x) >> 4))
92 #define MPC_RNDNN RNDC(GMP_RNDN,GMP_RNDN)
93 #define MPC_RNDNZ RNDC(GMP_RNDN,GMP_RNDZ)
94 #define MPC_RNDNU RNDC(GMP_RNDN,GMP_RNDU)
95 #define MPC_RNDND RNDC(GMP_RNDN,GMP_RNDD)
97 #define MPC_RNDZN RNDC(GMP_RNDZ,GMP_RNDN)
98 #define MPC_RNDZZ RNDC(GMP_RNDZ,GMP_RNDZ)
99 #define MPC_RNDZU RNDC(GMP_RNDZ,GMP_RNDU)
100 #define MPC_RNDZD RNDC(GMP_RNDZ,GMP_RNDD)
102 #define MPC_RNDUN RNDC(GMP_RNDU,GMP_RNDN)
103 #define MPC_RNDUZ RNDC(GMP_RNDU,GMP_RNDZ)
104 #define MPC_RNDUU RNDC(GMP_RNDU,GMP_RNDU)
105 #define MPC_RNDUD RNDC(GMP_RNDU,GMP_RNDD)
107 #define MPC_RNDDN RNDC(GMP_RNDD,GMP_RNDN)
108 #define MPC_RNDDZ RNDC(GMP_RNDD,GMP_RNDZ)
109 #define MPC_RNDDU RNDC(GMP_RNDD,GMP_RNDU)
110 #define MPC_RNDDD RNDC(GMP_RNDD,GMP_RNDD)
113 /* Definitions of types and their semantics */
121 typedef __mpc_struct mpc_t
[1];
122 typedef __mpc_struct
*mpc_ptr
;
123 typedef __gmp_const __mpc_struct
*mpc_srcptr
;
125 /* Prototypes: Support of K&R compiler */
126 #if defined (__GMP_PROTO)
127 # define __MPC_PROTO __GMP_PROTO
128 #elif defined (__STDC__) || defined (__cplusplus)
129 # define __MPC_PROTO(x) x
131 # define __MPC_PROTO(x) ()
134 /* Support for WINDOWS Dll:
135 Check if we are inside a MPC build, and if so export the functions.
136 Otherwise does the same thing as GMP */
137 #if defined(__MPC_WITHIN_MPC) && __GMP_LIBGMP_DLL
138 # define __MPC_DECLSPEC __GMP_DECLSPEC_EXPORT
140 # define __MPC_DECLSPEC __GMP_DECLSPEC
143 #if defined (__cplusplus)
147 __MPC_DECLSPEC
int mpc_add
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, mpc_srcptr
, mpc_rnd_t
));
148 __MPC_DECLSPEC
int mpc_add_fr
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, mpfr_srcptr
, mpc_rnd_t
));
149 __MPC_DECLSPEC
int mpc_add_si
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, long int, mpc_rnd_t
));
150 __MPC_DECLSPEC
int mpc_add_ui
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, unsigned long int, mpc_rnd_t
));
151 __MPC_DECLSPEC
int mpc_sub
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, mpc_srcptr
, mpc_rnd_t
));
152 __MPC_DECLSPEC
int mpc_sub_fr
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, mpfr_srcptr
, mpc_rnd_t
));
153 __MPC_DECLSPEC
int mpc_fr_sub
__MPC_PROTO ((mpc_ptr
, mpfr_srcptr
, mpc_srcptr
, mpc_rnd_t
));
154 __MPC_DECLSPEC
int mpc_sub_ui
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, unsigned long int, mpc_rnd_t
));
155 __MPC_DECLSPEC
int mpc_ui_ui_sub
__MPC_PROTO ((mpc_ptr
, unsigned long int, unsigned long int, mpc_srcptr
, mpc_rnd_t
));
156 __MPC_DECLSPEC
int mpc_mul
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, mpc_srcptr
, mpc_rnd_t
));
157 __MPC_DECLSPEC
int mpc_mul_fr
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, mpfr_srcptr
, mpc_rnd_t
));
158 __MPC_DECLSPEC
int mpc_mul_ui
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, unsigned long int, mpc_rnd_t
));
159 __MPC_DECLSPEC
int mpc_mul_si
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, long int, mpc_rnd_t
));
160 __MPC_DECLSPEC
int mpc_mul_i
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, int, mpc_rnd_t
));
161 __MPC_DECLSPEC
int mpc_sqr
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, mpc_rnd_t
));
162 __MPC_DECLSPEC
int mpc_div
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, mpc_srcptr
, mpc_rnd_t
));
163 __MPC_DECLSPEC
int mpc_pow
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, mpc_srcptr
, mpc_rnd_t
));
164 __MPC_DECLSPEC
int mpc_pow_fr
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, mpfr_srcptr
, mpc_rnd_t
));
165 __MPC_DECLSPEC
int mpc_pow_ld
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, long double, mpc_rnd_t
));
166 __MPC_DECLSPEC
int mpc_pow_d
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, double, mpc_rnd_t
));
167 __MPC_DECLSPEC
int mpc_pow_si
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, long, mpc_rnd_t
));
168 __MPC_DECLSPEC
int mpc_pow_ui
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, unsigned long, mpc_rnd_t
));
169 __MPC_DECLSPEC
int mpc_pow_z
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, mpz_srcptr
, mpc_rnd_t
));
170 __MPC_DECLSPEC
int mpc_div_fr
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, mpfr_srcptr
, mpc_rnd_t
));
171 __MPC_DECLSPEC
int mpc_fr_div
__MPC_PROTO ((mpc_ptr
, mpfr_srcptr
, mpc_srcptr
, mpc_rnd_t
));
172 __MPC_DECLSPEC
int mpc_div_ui
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, unsigned long int, mpc_rnd_t
));
173 __MPC_DECLSPEC
int mpc_ui_div
__MPC_PROTO ((mpc_ptr
, unsigned long int, mpc_srcptr
, mpc_rnd_t
));
174 __MPC_DECLSPEC
int mpc_div_2exp
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, unsigned long int, mpc_rnd_t
));
175 __MPC_DECLSPEC
int mpc_mul_2exp
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, unsigned long int, mpc_rnd_t
));
176 __MPC_DECLSPEC
int mpc_conj
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, mpc_rnd_t
));
177 __MPC_DECLSPEC
int mpc_neg
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, mpc_rnd_t
));
178 __MPC_DECLSPEC
int mpc_norm
__MPC_PROTO ((mpfr_ptr
, mpc_srcptr
, mpfr_rnd_t
));
179 __MPC_DECLSPEC
int mpc_abs
__MPC_PROTO ((mpfr_ptr
, mpc_srcptr
, mpfr_rnd_t
));
180 __MPC_DECLSPEC
int mpc_sqrt
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, mpc_rnd_t
));
181 __MPC_DECLSPEC
int mpc_set
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, mpc_rnd_t
));
182 __MPC_DECLSPEC
int mpc_set_d
__MPC_PROTO ((mpc_ptr
, double, mpc_rnd_t
));
183 __MPC_DECLSPEC
int mpc_set_d_d
__MPC_PROTO ((mpc_ptr
, double, double, mpc_rnd_t
));
184 __MPC_DECLSPEC
int mpc_set_ld
__MPC_PROTO ((mpc_ptr
, long double, mpc_rnd_t
));
185 __MPC_DECLSPEC
int mpc_set_ld_ld
__MPC_PROTO ((mpc_ptr
, long double, long double, mpc_rnd_t
));
186 __MPC_DECLSPEC
int mpc_set_f
__MPC_PROTO ((mpc_ptr
, mpf_srcptr
, mpc_rnd_t
));
187 __MPC_DECLSPEC
int mpc_set_f_f
__MPC_PROTO ((mpc_ptr
, mpf_srcptr
, mpf_srcptr
, mpc_rnd_t
));
188 __MPC_DECLSPEC
int mpc_set_fr
__MPC_PROTO ((mpc_ptr
, mpfr_srcptr
, mpc_rnd_t
));
189 __MPC_DECLSPEC
int mpc_set_fr_fr
__MPC_PROTO ((mpc_ptr
, mpfr_srcptr
, mpfr_srcptr
, mpc_rnd_t
));
190 __MPC_DECLSPEC
int mpc_set_q
__MPC_PROTO ((mpc_ptr
, mpq_srcptr
, mpc_rnd_t
));
191 __MPC_DECLSPEC
int mpc_set_q_q
__MPC_PROTO ((mpc_ptr
, mpq_srcptr
, mpq_srcptr
, mpc_rnd_t
));
192 __MPC_DECLSPEC
int mpc_set_si
__MPC_PROTO ((mpc_ptr
, long int, mpc_rnd_t
));
193 __MPC_DECLSPEC
int mpc_set_si_si
__MPC_PROTO ((mpc_ptr
, long int, long int, mpc_rnd_t
));
194 __MPC_DECLSPEC
int mpc_set_ui
__MPC_PROTO ((mpc_ptr
, unsigned long int, mpc_rnd_t
));
195 __MPC_DECLSPEC
int mpc_set_ui_ui
__MPC_PROTO ((mpc_ptr
, unsigned long int, unsigned long int, mpc_rnd_t
));
196 __MPC_DECLSPEC
int mpc_set_z
__MPC_PROTO ((mpc_ptr
, mpz_srcptr
, mpc_rnd_t
));
197 __MPC_DECLSPEC
int mpc_set_z_z
__MPC_PROTO ((mpc_ptr
, mpz_srcptr
, mpz_srcptr
, mpc_rnd_t
));
198 __MPC_DECLSPEC
void mpc_swap
__MPC_PROTO ((mpc_ptr
, mpc_ptr
));
199 __MPC_DECLSPEC
int mpc_fma
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, mpc_srcptr
, mpc_srcptr
, mpc_rnd_t
));
201 #ifdef _MPC_H_HAVE_INTMAX_T
202 __MPC_DECLSPEC
int mpc_set_sj
__MPC_PROTO ((mpc_ptr
, intmax_t, mpc_rnd_t
));
203 __MPC_DECLSPEC
int mpc_set_uj
__MPC_PROTO ((mpc_ptr
, uintmax_t, mpc_rnd_t
));
204 __MPC_DECLSPEC
int mpc_set_sj_sj
__MPC_PROTO ((mpc_ptr
, intmax_t, intmax_t, mpc_rnd_t
));
205 __MPC_DECLSPEC
int mpc_set_uj_uj
__MPC_PROTO ((mpc_ptr
, uintmax_t, uintmax_t, mpc_rnd_t
));
208 #ifdef _MPC_H_HAVE_COMPLEX
209 __MPC_DECLSPEC
int mpc_set_dc
__MPC_PROTO ((mpc_ptr
, double _Complex
, mpc_rnd_t
));
210 __MPC_DECLSPEC
int mpc_set_ldc
__MPC_PROTO ((mpc_ptr
, long double _Complex
, mpc_rnd_t
));
211 __MPC_DECLSPEC
double _Complex mpc_get_dc
__MPC_PROTO ((mpc_srcptr
, mpc_rnd_t
));
212 __MPC_DECLSPEC
long double _Complex mpc_get_ldc
__MPC_PROTO ((mpc_srcptr
, mpc_rnd_t
));
215 __MPC_DECLSPEC
void mpc_set_nan
__MPC_PROTO ((mpc_ptr
));
217 __MPC_DECLSPEC
int mpc_real
__MPC_PROTO ((mpfr_ptr
, mpc_srcptr
, mpfr_rnd_t
));
218 __MPC_DECLSPEC
int mpc_imag
__MPC_PROTO ((mpfr_ptr
, mpc_srcptr
, mpfr_rnd_t
));
219 __MPC_DECLSPEC
int mpc_arg
__MPC_PROTO ((mpfr_ptr
, mpc_srcptr
, mpfr_rnd_t
));
220 __MPC_DECLSPEC
int mpc_proj
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, mpc_rnd_t
));
221 __MPC_DECLSPEC
int mpc_cmp
__MPC_PROTO ((mpc_srcptr
, mpc_srcptr
));
222 __MPC_DECLSPEC
int mpc_cmp_si_si
__MPC_PROTO ((mpc_srcptr
, long int, long int));
223 __MPC_DECLSPEC
int mpc_exp
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, mpc_rnd_t
));
224 __MPC_DECLSPEC
int mpc_log
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, mpc_rnd_t
));
225 __MPC_DECLSPEC
int mpc_sin
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, mpc_rnd_t
));
226 __MPC_DECLSPEC
int mpc_cos
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, mpc_rnd_t
));
227 __MPC_DECLSPEC
int mpc_sin_cos
__MPC_PROTO ((mpc_ptr
, mpc_ptr
, mpc_srcptr
, mpc_rnd_t
, mpc_rnd_t
));
228 __MPC_DECLSPEC
int mpc_tan
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, mpc_rnd_t
));
229 __MPC_DECLSPEC
int mpc_sinh
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, mpc_rnd_t
));
230 __MPC_DECLSPEC
int mpc_cosh
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, mpc_rnd_t
));
231 __MPC_DECLSPEC
int mpc_tanh
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, mpc_rnd_t
));
232 __MPC_DECLSPEC
int mpc_asin
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, mpc_rnd_t
));
233 __MPC_DECLSPEC
int mpc_acos
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, mpc_rnd_t
));
234 __MPC_DECLSPEC
int mpc_atan
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, mpc_rnd_t
));
235 __MPC_DECLSPEC
int mpc_asinh
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, mpc_rnd_t
));
236 __MPC_DECLSPEC
int mpc_acosh
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, mpc_rnd_t
));
237 __MPC_DECLSPEC
int mpc_atanh
__MPC_PROTO ((mpc_ptr
, mpc_srcptr
, mpc_rnd_t
));
238 __MPC_DECLSPEC
void mpc_clear
__MPC_PROTO ((mpc_ptr
));
239 __MPC_DECLSPEC
int mpc_urandom
__MPC_PROTO ((mpc_ptr
, gmp_randstate_t
));
240 __MPC_DECLSPEC
void mpc_init2
__MPC_PROTO ((mpc_ptr
, mpfr_prec_t
));
241 __MPC_DECLSPEC
void mpc_init3
__MPC_PROTO ((mpc_ptr
, mpfr_prec_t
, mpfr_prec_t
));
242 __MPC_DECLSPEC mpfr_prec_t mpc_get_prec
__MPC_PROTO((mpc_srcptr x
));
243 __MPC_DECLSPEC
void mpc_get_prec2
__MPC_PROTO((mpfr_prec_t
*pr
, mpfr_prec_t
*pi
, mpc_srcptr x
));
244 __MPC_DECLSPEC
void mpc_set_prec
__MPC_PROTO ((mpc_ptr
, mpfr_prec_t
));
245 __MPC_DECLSPEC __gmp_const
char * mpc_get_version
__MPC_PROTO ((void));
247 __MPC_DECLSPEC
int mpc_strtoc
_MPFR_PROTO ((mpc_ptr
, const char *, char **, int, mpc_rnd_t
));
248 __MPC_DECLSPEC
int mpc_set_str
_MPFR_PROTO ((mpc_ptr
, const char *, int, mpc_rnd_t
));
249 __MPC_DECLSPEC
char * mpc_get_str
_MPFR_PROTO ((int, size_t, mpc_srcptr
, mpc_rnd_t
));
250 __MPC_DECLSPEC
void mpc_free_str
_MPFR_PROTO ((char *));
251 #ifdef _MPC_H_HAVE_FILE
252 __MPC_DECLSPEC
int mpc_inp_str
__MPC_PROTO ((mpc_ptr
, FILE *, size_t *, int, mpc_rnd_t
));
253 __MPC_DECLSPEC
size_t mpc_out_str
__MPC_PROTO ((FILE *, int, size_t, mpc_srcptr
, mpc_rnd_t
));
256 #if defined (__cplusplus)
260 #define mpc_realref(x) ((x)->re)
261 #define mpc_imagref(x) ((x)->im)
263 #define mpc_cmp_si(x, y) \
264 ( mpc_cmp_si_si ((x), (y), 0l) )
265 #define mpc_ui_sub(x, y, z, r) mpc_ui_ui_sub (x, y, 0ul, z, r)
268 Define a fake mpfr_set_fr so that, for instance, mpc_set_fr_z would
269 be defined as follows:
270 mpc_set_fr_z (mpc_t rop, mpfr_t x, mpz_t y, mpc_rnd_t rnd)
271 MPC_SET_X_Y (fr, z, rop, x, y, rnd)
274 #define mpfr_set_fr mpfr_set
276 #define MPC_SET_X_Y(real_t, imag_t, z, real_value, imag_value, rnd) \
278 int _inex_re, _inex_im; \
279 _inex_re = (mpfr_set_ ## real_t) (mpc_realref (z), (real_value), MPC_RND_RE (rnd)); \
280 _inex_im = (mpfr_set_ ## imag_t) (mpc_imagref (z), (imag_value), MPC_RND_IM (rnd)); \
281 return MPC_INEX (_inex_re, _inex_im); \
284 #endif /* ifndef __MPC_H */