Blame src/mpc-impl.h

Packit Service 2e9770
/* mpc-impl.h -- Internal include file for mpc.
Packit Service 2e9770
Packit Service 2e9770
Copyright (C) 2002, 2004, 2005, 2008, 2009, 2010, 2011, 2012 INRIA
Packit Service 2e9770
Packit Service 2e9770
This file is part of GNU MPC.
Packit Service 2e9770
Packit Service 2e9770
GNU MPC is free software; you can redistribute it and/or modify it under
Packit Service 2e9770
the terms of the GNU Lesser General Public License as published by the
Packit Service 2e9770
Free Software Foundation; either version 3 of the License, or (at your
Packit Service 2e9770
option) any later version.
Packit Service 2e9770
Packit Service 2e9770
GNU MPC is distributed in the hope that it will be useful, but WITHOUT ANY
Packit Service 2e9770
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
Packit Service 2e9770
FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
Packit Service 2e9770
more details.
Packit Service 2e9770
Packit Service 2e9770
You should have received a copy of the GNU Lesser General Public License
Packit Service 2e9770
along with this program. If not, see http://www.gnu.org/licenses/ .
Packit Service 2e9770
*/
Packit Service 2e9770
Packit Service 2e9770
#ifndef __MPC_IMPL_H
Packit Service 2e9770
#define __MPC_IMPL_H
Packit Service 2e9770
#define __MPC_LIBRARY_BUILD
Packit Service 2e9770
   /* to indicate we are inside the library build */
Packit Service 2e9770
Packit Service 2e9770
#include "config.h"
Packit Service 2e9770
#ifdef HAVE_STDLIB_H
Packit Service 2e9770
#include <stdlib.h>
Packit Service 2e9770
#endif
Packit Service 2e9770
#include "mpc.h"
Packit Service 2e9770
Packit Service 2e9770
/*
Packit Service 2e9770
 * Miscellaneous useful macros
Packit Service 2e9770
 */
Packit Service 2e9770
Packit Service 2e9770
#define MPC_MIN(h,i) ((h) < (i) ? (h) : (i))
Packit Service 2e9770
#define MPC_MAX(h,i) ((h) > (i) ? (h) : (i))
Packit Service 2e9770
Packit Service 2e9770
/* Safe absolute value (to avoid possible integer overflow) */
Packit Service 2e9770
/* type is the target (unsigned) type (copied from mpfr-impl.h) */
Packit Service 2e9770
#ifdef SAFE_ABS
Packit Service 2e9770
#undef SAFE_ABS
Packit Service 2e9770
#endif
Packit Service 2e9770
#define SAFE_ABS(type,x) ((x) >= 0 ? (type)(x) : -(type)(x))
Packit Service 2e9770
Packit Service 2e9770
Packit Service 2e9770
/*
Packit Service 2e9770
 * MPFR constants and macros
Packit Service 2e9770
 */
Packit Service 2e9770
Packit Service 2e9770
#ifndef BITS_PER_MP_LIMB
Packit Service 2e9770
#define BITS_PER_MP_LIMB mp_bits_per_limb
Packit Service 2e9770
#endif
Packit Service 2e9770
Packit Service 2e9770
#define MPFR_SIGNBIT(x) (mpfr_signbit (x) ? -1 : 1)
Packit Service 2e9770
#define MPC_MPFR_SIGN(x) (mpfr_zero_p (x) ? 0 : MPFR_SIGNBIT (x))
Packit Service 2e9770
   /* should be called MPFR_SIGN, but this is taken in mpfr.h */
Packit Service 2e9770
#define MPFR_CHANGE_SIGN(x) mpfr_neg(x,x,MPFR_RNDN)
Packit Service 2e9770
#define MPFR_COPYSIGN(x,y,z,rnd) (mpfr_nan_p (z) ? \
Packit Service 2e9770
   mpfr_setsign (x, y, 0, rnd) : \
Packit Service 2e9770
   mpfr_copysign (x, y, z, rnd))
Packit Service 2e9770
   /* work around spurious signs in nan */
Packit Service 2e9770
#define MPFR_ADD_ONE_ULP(x) \
Packit Service 2e9770
  (mpfr_sgn (x) > 0 ? mpfr_nextabove (x) : mpfr_nextbelow (x))
Packit Service 2e9770
#define MPFR_SUB_ONE_ULP(x) \
Packit Service 2e9770
  (mpfr_sgn (x) > 0 ? mpfr_nextbelow (x) : mpfr_nextabove (x))
Packit Service 2e9770
   /* drop unused rounding mode from macros */
Packit Service 2e9770
#define MPFR_SWAP(a,b) do { mpfr_srcptr tmp; tmp = a; a = b; b = tmp; } while (0)
Packit Service 2e9770
Packit Service 2e9770
Packit Service 2e9770
/*
Packit Service 2e9770
 * MPC macros
Packit Service 2e9770
 */
Packit Service 2e9770
Packit Service 2e9770
#define MPC_PREC_RE(x) (mpfr_get_prec(mpc_realref(x)))
Packit Service 2e9770
#define MPC_PREC_IM(x) (mpfr_get_prec(mpc_imagref(x)))
Packit Service 2e9770
#define MPC_MAX_PREC(x) MPC_MAX(MPC_PREC_RE(x), MPC_PREC_IM(x))
Packit Service 2e9770
Packit Service 2e9770
#define INV_RND(r) \
Packit Service 2e9770
   (((r) == MPFR_RNDU) ? MPFR_RNDD : (((r) == MPFR_RNDD) ? MPFR_RNDU : (r)))
Packit Service 2e9770
Packit Service 2e9770
/* Return non-zero if 'rnd' rounds towards zero, for a number of sign 'sgn' */
Packit Service 2e9770
#define MPC_IS_LIKE_RNDZ(rnd, sgn) \
Packit Service 2e9770
  ((rnd==MPFR_RNDZ) || (sgn<0 && rnd==MPFR_RNDU) || (sgn>0 && rnd==MPFR_RNDD))
Packit Service 2e9770
Packit Service 2e9770
/* Return non-zero if 'rnd' rounds away from zero for a number of sign 'sgn' */
Packit Service 2e9770
#define MPC_IS_LIKE_RNDA(rnd, sgn) \
Packit Service 2e9770
  ((sgn<0 && rnd==MPFR_RNDD) || (sgn>0 && rnd==MPFR_RNDU))
Packit Service 2e9770
Packit Service 2e9770
#define mpc_inf_p(z) (mpfr_inf_p(mpc_realref(z))||mpfr_inf_p(mpc_imagref(z)))
Packit Service 2e9770
   /* Convention in C99 (G.3): z is regarded as an infinity if at least one of
Packit Service 2e9770
      its parts is infinite */
Packit Service 2e9770
#define mpc_zero_p(z) (mpfr_zero_p(mpc_realref(z))&&mpfr_zero_p(mpc_imagref(z)))
Packit Service 2e9770
   /* Convention in C99 (G.3): z is regarded as a zero if each of its parts is
Packit Service 2e9770
      a zero */
Packit Service 2e9770
#define mpc_fin_p(z) (mpfr_number_p(mpc_realref(z))&&mpfr_number_p(mpc_imagref(z)))
Packit Service 2e9770
   /* Convention in C99 (G.3): z is regarded as finite if both its parts are */
Packit Service 2e9770
#define mpc_nan_p(z) ((mpfr_nan_p(mpc_realref(z)) && !mpfr_inf_p(mpc_imagref(z))) || (mpfr_nan_p(mpc_imagref(z)) && !mpfr_inf_p(mpc_realref(z))))
Packit Service 2e9770
   /* Consider as NaN all other numbers containing at least one NaN */
Packit Service 2e9770
Packit Service 2e9770
Packit Service 2e9770
/*
Packit Service 2e9770
 * ASSERT macros
Packit Service 2e9770
 */
Packit Service 2e9770
Packit Service 2e9770
#ifdef NDEBUG
Packit Service 2e9770
#define MPC_ASSERT(expr) \
Packit Service 2e9770
  do {                   \
Packit Service 2e9770
  } while (0)
Packit Service 2e9770
#else
Packit Service 2e9770
#define MPC_ASSERT(expr)                                        \
Packit Service 2e9770
  do {                                                          \
Packit Service 2e9770
    if (!(expr))                                                \
Packit Service 2e9770
      {                                                         \
Packit Service 2e9770
        fprintf (stderr, "%s:%d: MPC assertion failed: %s\n",   \
Packit Service 2e9770
                 __FILE__, __LINE__, #expr);                    \
Packit Service 2e9770
        abort();                                                \
Packit Service 2e9770
      }                                                         \
Packit Service 2e9770
  } while (0)
Packit Service 2e9770
#endif
Packit Service 2e9770
Packit Service 2e9770
Packit Service 2e9770
/*
Packit Service 2e9770
 * Debug macros
Packit Service 2e9770
 */
Packit Service 2e9770
Packit Service 2e9770
#define MPC_OUT(x)                                              \
Packit Service 2e9770
do {                                                            \
Packit Service 2e9770
  printf (#x "[%lu,%lu]=", (unsigned long int) MPC_PREC_RE (x), \
Packit Service 2e9770
      (unsigned long int) MPC_PREC_IM (x));                     \
Packit Service 2e9770
  mpc_out_str (stdout, 2, 0, x, MPC_RNDNN);                     \
Packit Service 2e9770
  printf ("\n");                                                \
Packit Service 2e9770
} while (0)
Packit Service 2e9770
Packit Service 2e9770
#define MPFR_OUT(x)                                             \
Packit Service 2e9770
do {                                                            \
Packit Service 2e9770
  printf (#x "[%lu]=", (unsigned long int) mpfr_get_prec (x));  \
Packit Service 2e9770
  mpfr_out_str (stdout, 2, 0, x, MPFR_RNDN);                     \
Packit Service 2e9770
  printf ("\n");                                                \
Packit Service 2e9770
} while (0)
Packit Service 2e9770
Packit Service 2e9770
Packit Service 2e9770
/*
Packit Service 2e9770
 * Constants
Packit Service 2e9770
 */
Packit Service 2e9770
Packit Service 2e9770
#ifndef MUL_KARATSUBA_THRESHOLD
Packit Service 2e9770
#define MUL_KARATSUBA_THRESHOLD 23
Packit Service 2e9770
#endif
Packit Service 2e9770
Packit Service 2e9770
Packit Service 2e9770
/*
Packit Service 2e9770
 * Define internal functions
Packit Service 2e9770
 */
Packit Service 2e9770
Packit Service 2e9770
#if defined (__cplusplus)
Packit Service 2e9770
extern "C" {
Packit Service 2e9770
#endif
Packit Service 2e9770
Packit Service 2e9770
Packit Service 2e9770
__MPC_DECLSPEC int  mpc_mul_naive (mpc_ptr, mpc_srcptr, mpc_srcptr, mpc_rnd_t);
Packit Service 2e9770
__MPC_DECLSPEC int  mpc_mul_karatsuba (mpc_ptr, mpc_srcptr, mpc_srcptr, mpc_rnd_t);
Packit Service 2e9770
__MPC_DECLSPEC int  mpc_fma_naive (mpc_ptr, mpc_srcptr, mpc_srcptr, mpc_srcptr, mpc_rnd_t);
Packit Service 2e9770
__MPC_DECLSPEC int  mpc_pow_usi (mpc_ptr, mpc_srcptr, unsigned long, int, mpc_rnd_t);
Packit Service 2e9770
__MPC_DECLSPEC char* mpc_alloc_str (size_t);
Packit Service 2e9770
__MPC_DECLSPEC char* mpc_realloc_str (char*, size_t, size_t);
Packit Service 2e9770
__MPC_DECLSPEC void mpc_free_str (char*);
Packit Service 2e9770
__MPC_DECLSPEC mpfr_prec_t mpc_ceil_log2 (mpfr_prec_t);
Packit Service 2e9770
__MPC_DECLSPEC int set_pi_over_2 (mpfr_ptr, int, mpfr_rnd_t);
Packit Service 2e9770
__MPC_DECLSPEC int mpc_fix_inf (mpfr_t x, mpfr_rnd_t rnd);
Packit Service 2e9770
__MPC_DECLSPEC int mpc_fix_zero (mpfr_t x, mpfr_rnd_t rnd);
Packit Service 2e9770
Packit Service 2e9770
#if defined (__cplusplus)
Packit Service 2e9770
}
Packit Service 2e9770
#endif
Packit Service 2e9770
Packit Service 2e9770
Packit Service 2e9770
#endif