mpc (1.3.1)

(root)/
include/
mpc.h
       1  /* mpc.h -- Include file for mpc.
       2  
       3  Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011, 2012, 2016, 2017, 2018, 2020, 2021, 2022 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 <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.  */
      73  typedef 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  
     112  typedef struct {
     113    mpfr_t re;
     114    mpfr_t im;
     115  }
     116  __mpc_struct;
     117  
     118  typedef __mpc_struct mpc_t[1];
     119  typedef __mpc_struct *mpc_ptr;
     120  typedef const __mpc_struct *mpc_srcptr;
     121  
     122  typedef struct {
     123     int64_t mant;
     124     int64_t exp;
     125  }
     126  __mpcr_struct;
     127  
     128  typedef __mpcr_struct mpcr_t [1];
     129  typedef __mpcr_struct *mpcr_ptr;
     130  typedef const __mpcr_struct *mpcr_srcptr;
     131  
     132  typedef struct {
     133    mpc_t  c;
     134    mpcr_t r;
     135  }
     136  __mpcb_struct;
     137  
     138  typedef __mpcb_struct mpcb_t [1];
     139  typedef __mpcb_struct *mpcb_ptr;
     140  typedef 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)
     152  extern "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 */