|
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
|