1/* mpc.h -- Include file for mpc.
2
3Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011, 2012, 2016, 2017, 2018, 2020, 2021, 2022 INRIA
4
5This file is part of GNU MPC.
6
7GNU MPC is free software; you can redistribute it and/or modify it under
8the terms of the GNU Lesser General Public License as published by the
9Free Software Foundation; either version 3 of the License, or (at your
10option) any later version.
11
12GNU MPC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
15more details.
16
17You should have received a copy of the GNU Lesser General Public License
18along with this program. If not, see http://www.gnu.org/licenses/ .
19*/
20
21#ifndef __MPC_H
22#define __MPC_H
23
24#include <stdint.h>
25#include "gmp.h"
26#include "mpfr.h"
27
28/* Define MPC version number */
29#define MPC_VERSION_MAJOR 1
30#define MPC_VERSION_MINOR 3
31#define MPC_VERSION_PATCHLEVEL 1
32#define MPC_VERSION_STRING "1.3.1"
33
34/* Macros dealing with MPC VERSION */
35#define MPC_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c))
36#define MPC_VERSION \
37 MPC_VERSION_NUM(MPC_VERSION_MAJOR,MPC_VERSION_MINOR,MPC_VERSION_PATCHLEVEL)
38
39/* Check if stdint.h/inttypes.h is included */
40#if defined (INTMAX_C) && defined (UINTMAX_C)
41#define _MPC_H_HAVE_INTMAX_T 1
42#endif
43
44/* Return values */
45
46/* Transform negative to 2, positive to 1, leave 0 unchanged.
47 Warning: since inex is evaluated two times, we should avoid
48 MPC_INEX(mpc_mul (...), mpc_mul (...)) */
49#define MPC_INEX_POS(inex) (((inex) < 0) ? 2 : ((inex) == 0) ? 0 : 1)
50/* Transform 2 to negative, 1 to positive, leave 0 unchanged */
51#define MPC_INEX_NEG(inex) (((inex) == 2) ? -1 : ((inex) == 0) ? 0 : 1)
52
53/* The global inexact flag is made of (real flag) + 4 * (imaginary flag), where
54 each of the real and imaginary inexact flag are:
55 0 when the result is exact (no rounding error)
56 1 when the result is larger than the exact value
57 2 when the result is smaller than the exact value */
58#define MPC_INEX(inex_re, inex_im) \
59 (MPC_INEX_POS(inex_re) | (MPC_INEX_POS(inex_im) << 2))
60#define MPC_INEX_RE(inex) MPC_INEX_NEG((inex) & 3)
61#define MPC_INEX_IM(inex) MPC_INEX_NEG((inex) >> 2)
62
63/* For functions computing two results, the return value is
64 inexact1+16*inexact2, which is 0 iif both results are exact. */
65#define MPC_INEX12(inex1, inex2) (inex1 | (inex2 << 4))
66#define MPC_INEX1(inex) (inex & 15)
67#define MPC_INEX2(inex) (inex >> 4)
68
69/* Definition of rounding modes */
70
71/* a complex rounding mode is just a pair of two real rounding modes
72 we reserve four bits for a real rounding mode. */
73typedef int mpc_rnd_t;
74
75#define MPC_RND(r1,r2) (((int)(r1)) + ((int)(r2) << 4))
76#define MPC_RND_RE(x) ((mpfr_rnd_t)((x) & 0x0F))
77#define MPC_RND_IM(x) ((mpfr_rnd_t)((x) >> 4))
78
79#define MPC_RNDNN MPC_RND (MPFR_RNDN,MPFR_RNDN)
80#define MPC_RNDNZ MPC_RND (MPFR_RNDN,MPFR_RNDZ)
81#define MPC_RNDNU MPC_RND (MPFR_RNDN,MPFR_RNDU)
82#define MPC_RNDND MPC_RND (MPFR_RNDN,MPFR_RNDD)
83#define MPC_RNDNA MPC_RND (MPFR_RNDN,MPFR_RNDA)
84
85#define MPC_RNDZN MPC_RND (MPFR_RNDZ,MPFR_RNDN)
86#define MPC_RNDZZ MPC_RND (MPFR_RNDZ,MPFR_RNDZ)
87#define MPC_RNDZU MPC_RND (MPFR_RNDZ,MPFR_RNDU)
88#define MPC_RNDZD MPC_RND (MPFR_RNDZ,MPFR_RNDD)
89#define MPC_RNDZA MPC_RND (MPFR_RNDZ,MPFR_RNDA)
90
91#define MPC_RNDUN MPC_RND (MPFR_RNDU,MPFR_RNDN)
92#define MPC_RNDUZ MPC_RND (MPFR_RNDU,MPFR_RNDZ)
93#define MPC_RNDUU MPC_RND (MPFR_RNDU,MPFR_RNDU)
94#define MPC_RNDUD MPC_RND (MPFR_RNDU,MPFR_RNDD)
95#define MPC_RNDUA MPC_RND (MPFR_RNDU,MPFR_RNDA)
96
97#define MPC_RNDDN MPC_RND (MPFR_RNDD,MPFR_RNDN)
98#define MPC_RNDDZ MPC_RND (MPFR_RNDD,MPFR_RNDZ)
99#define MPC_RNDDU MPC_RND (MPFR_RNDD,MPFR_RNDU)
100#define MPC_RNDDD MPC_RND (MPFR_RNDD,MPFR_RNDD)
101#define MPC_RNDDA MPC_RND (MPFR_RNDD,MPFR_RNDA)
102
103#define MPC_RNDAN MPC_RND (MPFR_RNDA,MPFR_RNDN)
104#define MPC_RNDAZ MPC_RND (MPFR_RNDA,MPFR_RNDZ)
105#define MPC_RNDAU MPC_RND (MPFR_RNDA,MPFR_RNDU)
106#define MPC_RNDAD MPC_RND (MPFR_RNDA,MPFR_RNDD)
107#define MPC_RNDAA MPC_RND (MPFR_RNDA,MPFR_RNDA)
108
109
110/* Definitions of types and their semantics */
111
112typedef struct {
113 mpfr_t re;
114 mpfr_t im;
115}
116__mpc_struct;
117
118typedef __mpc_struct mpc_t[1];
119typedef __mpc_struct *mpc_ptr;
120typedef const __mpc_struct *mpc_srcptr;
121
122typedef struct {
123 int64_t mant;
124 int64_t exp;
125}
126__mpcr_struct;
127
128typedef __mpcr_struct mpcr_t [1];
129typedef __mpcr_struct *mpcr_ptr;
130typedef const __mpcr_struct *mpcr_srcptr;
131
132typedef struct {
133 mpc_t c;
134 mpcr_t r;
135}
136__mpcb_struct;
137
138typedef __mpcb_struct mpcb_t [1];
139typedef __mpcb_struct *mpcb_ptr;
140typedef const __mpcb_struct *mpcb_srcptr;
141
142/* Support for WINDOWS DLL, see
143 https://sympa.inria.fr/sympa/arc/mpc-discuss/2011-11/ ;
144 when building the DLL, export symbols, otherwise behave as GMP */
145#if defined (__MPC_LIBRARY_BUILD) && __GMP_LIBGMP_DLL
146#define __MPC_DECLSPEC __GMP_DECLSPEC_EXPORT
147#else
148#define __MPC_DECLSPEC __GMP_DECLSPEC
149#endif
150
151#if defined (__cplusplus)
152extern "C" {
153#endif
154
155__MPC_DECLSPEC int mpc_add (mpc_ptr, mpc_srcptr, mpc_srcptr, mpc_rnd_t);
156__MPC_DECLSPEC int mpc_add_fr (mpc_ptr, mpc_srcptr, mpfr_srcptr, mpc_rnd_t);
157__MPC_DECLSPEC int mpc_add_si (mpc_ptr, mpc_srcptr, long int, mpc_rnd_t);
158__MPC_DECLSPEC int mpc_add_ui (mpc_ptr, mpc_srcptr, unsigned long int, mpc_rnd_t);
159__MPC_DECLSPEC int mpc_sub (mpc_ptr, mpc_srcptr, mpc_srcptr, mpc_rnd_t);
160__MPC_DECLSPEC int mpc_sub_fr (mpc_ptr, mpc_srcptr, mpfr_srcptr, mpc_rnd_t);
161__MPC_DECLSPEC int mpc_fr_sub (mpc_ptr, mpfr_srcptr, mpc_srcptr, mpc_rnd_t);
162__MPC_DECLSPEC int mpc_sub_ui (mpc_ptr, mpc_srcptr, unsigned long int, mpc_rnd_t);
163__MPC_DECLSPEC int mpc_ui_ui_sub (mpc_ptr, unsigned long int, unsigned long int, mpc_srcptr, mpc_rnd_t);
164__MPC_DECLSPEC int mpc_mul (mpc_ptr, mpc_srcptr, mpc_srcptr, mpc_rnd_t);
165__MPC_DECLSPEC int mpc_mul_fr (mpc_ptr, mpc_srcptr, mpfr_srcptr, mpc_rnd_t);
166__MPC_DECLSPEC int mpc_mul_ui (mpc_ptr, mpc_srcptr, unsigned long int, mpc_rnd_t);
167__MPC_DECLSPEC int mpc_mul_si (mpc_ptr, mpc_srcptr, long int, mpc_rnd_t);
168__MPC_DECLSPEC int mpc_mul_i (mpc_ptr, mpc_srcptr, int, mpc_rnd_t);
169__MPC_DECLSPEC int mpc_sqr (mpc_ptr, mpc_srcptr, mpc_rnd_t);
170__MPC_DECLSPEC int mpc_div (mpc_ptr, mpc_srcptr, mpc_srcptr, mpc_rnd_t);
171__MPC_DECLSPEC int mpc_pow (mpc_ptr, mpc_srcptr, mpc_srcptr, mpc_rnd_t);
172__MPC_DECLSPEC int mpc_pow_fr (mpc_ptr, mpc_srcptr, mpfr_srcptr, mpc_rnd_t);
173__MPC_DECLSPEC int mpc_pow_ld (mpc_ptr, mpc_srcptr, long double, mpc_rnd_t);
174__MPC_DECLSPEC int mpc_pow_d (mpc_ptr, mpc_srcptr, double, mpc_rnd_t);
175__MPC_DECLSPEC int mpc_pow_si (mpc_ptr, mpc_srcptr, long, mpc_rnd_t);
176__MPC_DECLSPEC int mpc_pow_ui (mpc_ptr, mpc_srcptr, unsigned long, mpc_rnd_t);
177__MPC_DECLSPEC int mpc_pow_z (mpc_ptr, mpc_srcptr, mpz_srcptr, mpc_rnd_t);
178__MPC_DECLSPEC int mpc_div_fr (mpc_ptr, mpc_srcptr, mpfr_srcptr, mpc_rnd_t);
179__MPC_DECLSPEC int mpc_fr_div (mpc_ptr, mpfr_srcptr, mpc_srcptr, mpc_rnd_t);
180__MPC_DECLSPEC int mpc_div_ui (mpc_ptr, mpc_srcptr, unsigned long int, mpc_rnd_t);
181__MPC_DECLSPEC int mpc_ui_div (mpc_ptr, unsigned long int, mpc_srcptr, mpc_rnd_t);
182__MPC_DECLSPEC int mpc_div_2ui (mpc_ptr, mpc_srcptr, unsigned long int, mpc_rnd_t);
183__MPC_DECLSPEC int mpc_mul_2ui (mpc_ptr, mpc_srcptr, unsigned long int, mpc_rnd_t);
184__MPC_DECLSPEC int mpc_div_2si (mpc_ptr, mpc_srcptr, long int, mpc_rnd_t);
185__MPC_DECLSPEC int mpc_mul_2si (mpc_ptr, mpc_srcptr, long int, mpc_rnd_t);
186__MPC_DECLSPEC int mpc_conj (mpc_ptr, mpc_srcptr, mpc_rnd_t);
187__MPC_DECLSPEC int mpc_neg (mpc_ptr, mpc_srcptr, mpc_rnd_t);
188__MPC_DECLSPEC int mpc_sum (mpc_ptr, const mpc_ptr *, unsigned long, mpc_rnd_t);
189__MPC_DECLSPEC int mpc_dot (mpc_ptr, const mpc_ptr *, const mpc_ptr *, unsigned long, mpc_rnd_t);
190__MPC_DECLSPEC int mpc_norm (mpfr_ptr, mpc_srcptr, mpfr_rnd_t);
191__MPC_DECLSPEC int mpc_abs (mpfr_ptr, mpc_srcptr, mpfr_rnd_t);
192__MPC_DECLSPEC int mpc_sqrt (mpc_ptr, mpc_srcptr, mpc_rnd_t);
193__MPC_DECLSPEC int mpc_set (mpc_ptr, mpc_srcptr, mpc_rnd_t);
194__MPC_DECLSPEC int mpc_set_d (mpc_ptr, double, mpc_rnd_t);
195__MPC_DECLSPEC int mpc_set_d_d (mpc_ptr, double, double, mpc_rnd_t);
196__MPC_DECLSPEC int mpc_set_ld (mpc_ptr, long double, mpc_rnd_t);
197__MPC_DECLSPEC int mpc_set_ld_ld (mpc_ptr, long double, long double, mpc_rnd_t);
198__MPC_DECLSPEC int mpc_set_f (mpc_ptr, mpf_srcptr, mpc_rnd_t);
199__MPC_DECLSPEC int mpc_set_f_f (mpc_ptr, mpf_srcptr, mpf_srcptr, mpc_rnd_t);
200__MPC_DECLSPEC int mpc_set_fr (mpc_ptr, mpfr_srcptr, mpc_rnd_t);
201__MPC_DECLSPEC int mpc_set_fr_fr (mpc_ptr, mpfr_srcptr, mpfr_srcptr, mpc_rnd_t);
202__MPC_DECLSPEC int mpc_set_q (mpc_ptr, mpq_srcptr, mpc_rnd_t);
203__MPC_DECLSPEC int mpc_set_q_q (mpc_ptr, mpq_srcptr, mpq_srcptr, mpc_rnd_t);
204__MPC_DECLSPEC int mpc_set_si (mpc_ptr, long int, mpc_rnd_t);
205__MPC_DECLSPEC int mpc_set_si_si (mpc_ptr, long int, long int, mpc_rnd_t);
206__MPC_DECLSPEC int mpc_set_ui (mpc_ptr, unsigned long int, mpc_rnd_t);
207__MPC_DECLSPEC int mpc_set_ui_ui (mpc_ptr, unsigned long int, unsigned long int, mpc_rnd_t);
208__MPC_DECLSPEC int mpc_set_z (mpc_ptr, mpz_srcptr, mpc_rnd_t);
209__MPC_DECLSPEC int mpc_set_z_z (mpc_ptr, mpz_srcptr, mpz_srcptr, mpc_rnd_t);
210__MPC_DECLSPEC void mpc_swap (mpc_ptr, mpc_ptr);
211__MPC_DECLSPEC int mpc_fma (mpc_ptr, mpc_srcptr, mpc_srcptr, mpc_srcptr, mpc_rnd_t);
212
213__MPC_DECLSPEC void mpc_set_nan (mpc_ptr);
214
215__MPC_DECLSPEC int mpc_real (mpfr_ptr, mpc_srcptr, mpfr_rnd_t);
216__MPC_DECLSPEC int mpc_imag (mpfr_ptr, mpc_srcptr, mpfr_rnd_t);
217__MPC_DECLSPEC int mpc_arg (mpfr_ptr, mpc_srcptr, mpfr_rnd_t);
218__MPC_DECLSPEC int mpc_proj (mpc_ptr, mpc_srcptr, mpc_rnd_t);
219__MPC_DECLSPEC int mpc_cmp (mpc_srcptr, mpc_srcptr);
220__MPC_DECLSPEC int mpc_cmp_si_si (mpc_srcptr, long int, long int);
221__MPC_DECLSPEC int mpc_cmp_abs (mpc_srcptr, mpc_srcptr);
222__MPC_DECLSPEC int mpc_exp (mpc_ptr, mpc_srcptr, mpc_rnd_t);
223__MPC_DECLSPEC int mpc_log (mpc_ptr, mpc_srcptr, mpc_rnd_t);
224__MPC_DECLSPEC int mpc_log10 (mpc_ptr, mpc_srcptr, mpc_rnd_t);
225__MPC_DECLSPEC int mpc_agm (mpc_ptr, mpc_srcptr, mpc_srcptr, mpc_rnd_t);
226__MPC_DECLSPEC int mpc_sin (mpc_ptr, mpc_srcptr, mpc_rnd_t);
227__MPC_DECLSPEC int mpc_cos (mpc_ptr, mpc_srcptr, mpc_rnd_t);
228__MPC_DECLSPEC int mpc_sin_cos (mpc_ptr, mpc_ptr, mpc_srcptr, mpc_rnd_t, mpc_rnd_t);
229__MPC_DECLSPEC int mpc_tan (mpc_ptr, mpc_srcptr, mpc_rnd_t);
230__MPC_DECLSPEC int mpc_sinh (mpc_ptr, mpc_srcptr, mpc_rnd_t);
231__MPC_DECLSPEC int mpc_cosh (mpc_ptr, mpc_srcptr, mpc_rnd_t);
232__MPC_DECLSPEC int mpc_tanh (mpc_ptr, mpc_srcptr, mpc_rnd_t);
233__MPC_DECLSPEC int mpc_asin (mpc_ptr, mpc_srcptr, mpc_rnd_t);
234__MPC_DECLSPEC int mpc_acos (mpc_ptr, mpc_srcptr, mpc_rnd_t);
235__MPC_DECLSPEC int mpc_atan (mpc_ptr, mpc_srcptr, mpc_rnd_t);
236__MPC_DECLSPEC int mpc_asinh (mpc_ptr, mpc_srcptr, mpc_rnd_t);
237__MPC_DECLSPEC int mpc_acosh (mpc_ptr, mpc_srcptr, mpc_rnd_t);
238__MPC_DECLSPEC int mpc_atanh (mpc_ptr, mpc_srcptr, mpc_rnd_t);
239__MPC_DECLSPEC int mpc_rootofunity (mpc_ptr, unsigned long int, unsigned long int, mpc_rnd_t);
240__MPC_DECLSPEC void mpc_clear (mpc_ptr);
241__MPC_DECLSPEC int mpc_urandom (mpc_ptr, gmp_randstate_t);
242__MPC_DECLSPEC void mpc_init2 (mpc_ptr, mpfr_prec_t);
243__MPC_DECLSPEC void mpc_init3 (mpc_ptr, mpfr_prec_t, mpfr_prec_t);
244__MPC_DECLSPEC mpfr_prec_t mpc_get_prec (mpc_srcptr x);
245__MPC_DECLSPEC void mpc_get_prec2 (mpfr_prec_t *pr, mpfr_prec_t *pi, mpc_srcptr x);
246__MPC_DECLSPEC void mpc_set_prec (mpc_ptr, mpfr_prec_t);
247__MPC_DECLSPEC const char * mpc_get_version (void);
248
249__MPC_DECLSPEC int mpc_strtoc (mpc_ptr, const char *, char **, int, mpc_rnd_t);
250__MPC_DECLSPEC int mpc_set_str (mpc_ptr, const char *, int, mpc_rnd_t);
251__MPC_DECLSPEC char * mpc_get_str (int, size_t, mpc_srcptr, mpc_rnd_t);
252__MPC_DECLSPEC void mpc_free_str (char *);
253
254/* declare certain functions only if appropriate headers have been included */
255#ifdef _MPC_H_HAVE_INTMAX_T
256__MPC_DECLSPEC int mpc_set_sj (mpc_ptr, intmax_t, mpc_rnd_t);
257__MPC_DECLSPEC int mpc_set_uj (mpc_ptr, uintmax_t, mpc_rnd_t);
258__MPC_DECLSPEC int mpc_set_sj_sj (mpc_ptr, intmax_t, intmax_t, mpc_rnd_t);
259__MPC_DECLSPEC int mpc_set_uj_uj (mpc_ptr, uintmax_t, uintmax_t, mpc_rnd_t);
260#endif
261
262#ifdef _Complex_I
263__MPC_DECLSPEC int mpc_set_dc (mpc_ptr, double _Complex, mpc_rnd_t);
264__MPC_DECLSPEC int mpc_set_ldc (mpc_ptr, long double _Complex, mpc_rnd_t);
265__MPC_DECLSPEC double _Complex mpc_get_dc (mpc_srcptr, mpc_rnd_t);
266__MPC_DECLSPEC long double _Complex mpc_get_ldc (mpc_srcptr, mpc_rnd_t);
267#endif
268
269#ifdef _GMP_H_HAVE_FILE
270__MPC_DECLSPEC int mpc_inp_str (mpc_ptr, FILE *, size_t *, int, mpc_rnd_t);
271__MPC_DECLSPEC size_t mpc_out_str (FILE *, int, size_t, mpc_srcptr, mpc_rnd_t);
272__MPC_DECLSPEC void mpcb_out_str (FILE *f, mpcb_srcptr);
273__MPC_DECLSPEC void mpcr_out_str (FILE *f, mpcr_srcptr r);
274#endif
275
276__MPC_DECLSPEC int mpcr_inf_p (mpcr_srcptr r);
277__MPC_DECLSPEC int mpcr_zero_p (mpcr_srcptr r);
278__MPC_DECLSPEC int mpcr_lt_half_p (mpcr_srcptr r);
279__MPC_DECLSPEC int mpcr_cmp (mpcr_srcptr r, mpcr_srcptr s);
280__MPC_DECLSPEC void mpcr_set_inf (mpcr_ptr r);
281__MPC_DECLSPEC void mpcr_set_zero (mpcr_ptr r);
282__MPC_DECLSPEC void mpcr_set_one (mpcr_ptr r);
283__MPC_DECLSPEC void mpcr_set (mpcr_ptr r, mpcr_srcptr s);
284__MPC_DECLSPEC void mpcr_set_ui64_2si64 (mpcr_ptr r, uint64_t mant,
285 int64_t exp);
286__MPC_DECLSPEC void mpcr_max (mpcr_ptr r, mpcr_srcptr s, mpcr_srcptr t);
287__MPC_DECLSPEC int64_t mpcr_get_exp (mpcr_srcptr r);
288__MPC_DECLSPEC void mpcr_mul (mpcr_ptr r, mpcr_srcptr s, mpcr_srcptr t);
289__MPC_DECLSPEC void mpcr_mul_2ui (mpcr_ptr r, mpcr_srcptr s,
290 unsigned long int e);
291__MPC_DECLSPEC void mpcr_sqr (mpcr_ptr r, mpcr_srcptr s);
292__MPC_DECLSPEC void mpcr_add (mpcr_ptr r, mpcr_srcptr s, mpcr_srcptr t);
293__MPC_DECLSPEC void mpcr_sub (mpcr_ptr r, mpcr_srcptr s, mpcr_srcptr t);
294__MPC_DECLSPEC void mpcr_sub_rnd (mpcr_ptr r, mpcr_srcptr s, mpcr_srcptr t,
295 mpfr_rnd_t rnd);
296__MPC_DECLSPEC void mpcr_div (mpcr_ptr r, mpcr_srcptr s, mpcr_srcptr t);
297__MPC_DECLSPEC void mpcr_div_2ui (mpcr_ptr r, mpcr_srcptr s,
298 unsigned long int e);
299__MPC_DECLSPEC int64_t sqrt_int64 (int64_t n);
300__MPC_DECLSPEC void mpcr_sqrt (mpcr_ptr r, mpcr_srcptr s);
301__MPC_DECLSPEC void mpcr_add_rounding_error (mpcr_ptr r, mpfr_prec_t p,
302 mpfr_rnd_t rnd);
303__MPC_DECLSPEC void mpcr_c_abs_rnd (mpcr_ptr r, mpc_srcptr z,
304 mpfr_rnd_t rnd);
305
306__MPC_DECLSPEC void mpcb_init (mpcb_ptr);
307__MPC_DECLSPEC void mpcb_clear (mpcb_ptr);
308__MPC_DECLSPEC mpfr_prec_t mpcb_get_prec (mpcb_srcptr);
309__MPC_DECLSPEC void mpcb_set_prec (mpcb_ptr, mpfr_prec_t);
310__MPC_DECLSPEC void mpcb_set (mpcb_ptr, mpcb_srcptr);
311__MPC_DECLSPEC void mpcb_set_inf (mpcb_ptr);
312__MPC_DECLSPEC void mpcb_set_c (mpcb_ptr, mpc_srcptr, mpfr_prec_t,
313 unsigned long int, unsigned long int);
314__MPC_DECLSPEC void mpcb_set_ui_ui (mpcb_ptr, unsigned long int,
315 unsigned long int, mpfr_prec_t);
316__MPC_DECLSPEC void mpcb_neg (mpcb_ptr, mpcb_srcptr);
317__MPC_DECLSPEC void mpcb_mul (mpcb_ptr, mpcb_srcptr, mpcb_srcptr);
318__MPC_DECLSPEC void mpcb_sqr (mpcb_ptr, mpcb_srcptr);
319__MPC_DECLSPEC void mpcb_pow_ui (mpcb_ptr, mpcb_srcptr, unsigned long int);
320__MPC_DECLSPEC void mpcb_add (mpcb_ptr, mpcb_srcptr, mpcb_srcptr);
321__MPC_DECLSPEC void mpcb_sqrt (mpcb_ptr, mpcb_srcptr);
322__MPC_DECLSPEC void mpcb_div (mpcb_ptr, mpcb_srcptr, mpcb_srcptr);
323__MPC_DECLSPEC void mpcb_div_2ui (mpcb_ptr, mpcb_srcptr, unsigned long int);
324__MPC_DECLSPEC int mpcb_can_round (mpcb_srcptr, mpfr_prec_t, mpfr_prec_t,
325 mpc_rnd_t);
326__MPC_DECLSPEC int mpcb_round (mpc_ptr, mpcb_srcptr, mpc_rnd_t);
327__MPC_DECLSPEC int mpc_eta_fund (mpc_ptr, mpc_srcptr, mpc_rnd_t);
328
329#if defined (__cplusplus)
330}
331#endif
332
333#define mpc_realref(x) ((x)->re)
334#define mpc_imagref(x) ((x)->im)
335
336#define mpc_cmp_si(x, y) \
337 ( mpc_cmp_si_si ((x), (y), 0l) )
338#define mpc_ui_sub(x, y, z, r) mpc_ui_ui_sub (x, y, 0ul, z, r)
339
340/*
341 Define a fake mpfr_set_fr so that, for instance, mpc_set_fr_z would
342 be defined as follows:
343 mpc_set_fr_z (mpc_t rop, mpfr_t x, mpz_t y, mpc_rnd_t rnd)
344 MPC_SET_X_Y (fr, z, rop, x, y, rnd)
345*/
346#ifndef mpfr_set_fr
347#define mpfr_set_fr mpfr_set
348#endif
349#define MPC_SET_X_Y(real_t, imag_t, z, real_value, imag_value, rnd) \
350 { \
351 int _inex_re, _inex_im; \
352 _inex_re = (mpfr_set_ ## real_t) (mpc_realref (z), (real_value), MPC_RND_RE (rnd)); \
353 _inex_im = (mpfr_set_ ## imag_t) (mpc_imagref (z), (imag_value), MPC_RND_IM (rnd)); \
354 return MPC_INEX (_inex_re, _inex_im); \
355 }
356
357#endif /* ifndef __MPC_H */
358

source code of include/mpc.h