~ubuntu-branches/ubuntu/intrepid/ecl/intrepid

« back to all changes in this revision

Viewing changes to src/gmp/mpfr/mpfr-impl.h

  • Committer: Bazaar Package Importer
  • Author(s): Peter Van Eynde
  • Date: 2007-04-09 11:51:51 UTC
  • mfrom: (1.1.3 upstream)
  • Revision ID: james.westby@ubuntu.com-20070409115151-ql8cr0kalzx1jmla
Tags: 0.9i-20070324-2
Upload to unstable. 

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* Utilities for MPFR developers, not exported.
2
 
 
3
 
Copyright 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
4
 
 
5
 
This file is part of the MPFR Library.
6
 
 
7
 
The MPFR 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.
11
 
 
12
 
The MPFR 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.
16
 
 
17
 
You should have received a copy of the GNU Lesser General Public License
18
 
along with the MPFR 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. */
21
 
 
22
 
/* Test if X (positive) is a power of 2 */
23
 
 
24
 
#define IS_POW2(X) (((X) & ((X) - 1)) == 0)
25
 
#define NOT_POW2(X) (((X) & ((X) - 1)) != 0)
26
 
 
27
 
/* This unsigned type must correspond to the signed one defined in gmp.h */
28
 
#if defined (_CRAY) && ! defined (_CRAYMPP)
29
 
typedef unsigned int            mp_exp_unsigned_t;
30
 
typedef unsigned int            mp_size_unsigned_t;
31
 
#else
32
 
typedef unsigned long int       mp_exp_unsigned_t;
33
 
typedef unsigned long int       mp_size_unsigned_t;
34
 
#endif
35
 
 
36
 
#define MP_EXP_T_MAX ((mp_exp_t) ((~ (mp_exp_unsigned_t) 0) >> 1))
37
 
#define MP_EXP_T_MIN (-MP_EXP_T_MAX-1)
38
 
 
39
 
#define MP_LIMB_T_ONE ((mp_limb_t) 1)
40
 
 
41
 
#if (BITS_PER_MP_LIMB & (BITS_PER_MP_LIMB - 1))
42
 
#error "BITS_PER_MP_LIMB must be a power of 2"
43
 
#endif
44
 
 
45
 
#define MPFR_INTPREC_MAX (ULONG_MAX & ~(unsigned long) (BITS_PER_MP_LIMB - 1))
46
 
 
47
 
/* Assertions */
48
 
 
49
 
/* Compile with -DWANT_ASSERT to check all assert statements */
50
 
 
51
 
/* MPFR_ASSERTN(expr): assertions that should always be checked */
52
 
/* #define MPFR_ASSERTN(expr) ASSERT_ALWAYS(expr) */
53
 
#define MPFR_ASSERTN(expr)  ((expr) ? (void) 0 : (void) ASSERT_FAIL (expr))
54
 
 
55
 
/* MPFR_ASSERTD(expr): assertions that should be checked when testing */
56
 
/* #define MPFR_ASSERTD(expr) ASSERT(expr) */
57
 
#if WANT_ASSERT
58
 
#define MPFR_ASSERTD(expr)  ASSERT_ALWAYS (expr)
59
 
#else
60
 
#define MPFR_ASSERTD(expr)  ((void) 0)
61
 
#endif
62
 
 
63
 
/* Definition of constants */
64
 
 
65
 
#define LOG2 0.69314718055994528622 /* log(2) rounded to zero on 53 bits */
66
 
#define ALPHA 4.3191365662914471407 /* a+2 = a*log(a), rounded to +infinity */
67
 
 
68
 
/* Safe absolute value (to avoid possible integer overflow) */
69
 
 
70
 
#define SAFE_ABS(type,x) ((x) >= 0 ? (unsigned type)(x) : -(unsigned type)(x))
71
 
 
72
 
/* macros for doubles, based on gmp union ieee_double_extract */
73
 
 
74
 
typedef union ieee_double_extract Ieee_double_extract;
75
 
 
76
 
#define DOUBLE_ISNANorINF(x) (((Ieee_double_extract *)&(x))->s.exp == 0x7ff)
77
 
#define DOUBLE_ISINF(x) (DOUBLE_ISNANorINF(x) && \
78
 
                         (((Ieee_double_extract *)&(x))->s.manl == 0) && \
79
 
                         (((Ieee_double_extract *)&(x))->s.manh == 0))
80
 
#define DOUBLE_ISNAN(x) (DOUBLE_ISNANorINF(x) && \
81
 
                         ((((Ieee_double_extract *)&(x))->s.manl != 0) || \
82
 
                         (((Ieee_double_extract *)&(x))->s.manh != 0)))
83
 
 
84
 
#define DBL_POS_INF (1.0/0.0)
85
 
#define DBL_NEG_INF (-1.0/0.0)
86
 
#define DBL_NAN (0.0/0.0)
87
 
 
88
 
/* bit 31 of _mpfr_size is used for sign,
89
 
   bit 30 of _mpfr_size is used for Nan flag,
90
 
   bit 29 of _mpfr_size is used for Inf flag,
91
 
   remaining bits are used to store the number of allocated limbs */
92
 
#define MPFR_CLEAR_FLAGS(x) \
93
 
  (((x) -> _mpfr_size &= ~((mp_size_unsigned_t) 3 << 29)))
94
 
#define MPFR_IS_NAN(x) (((x)->_mpfr_size >> 30) & 1)
95
 
#define MPFR_SET_NAN(x) ((x)->_mpfr_size |= ((mp_size_unsigned_t) 1 << 30))
96
 
#define MPFR_CLEAR_NAN(x) \
97
 
  (((x) -> _mpfr_size &= ~((mp_size_unsigned_t) 1 << 30)))
98
 
#define MPFR_IS_INF(x) (((x)->_mpfr_size >> 29) & 1)
99
 
#define MPFR_SET_INF(x) ((x)->_mpfr_size |= ((mp_size_unsigned_t) 1 << 29))
100
 
#define MPFR_CLEAR_INF(x) ((x)->_mpfr_size &= ~((mp_size_unsigned_t) 1 << 29))
101
 
#define MPFR_IS_FP(x) ((((x) -> _mpfr_size >> 29) & 3) == 0)
102
 
#define MPFR_ABSSIZE(x) \
103
 
  ((x)->_mpfr_size & (((mp_size_unsigned_t) 1 << 29) - 1))
104
 
#define MPFR_SET_ABSSIZE(x, n) \
105
 
  ((x)->_mpfr_size = ((x)->_mpfr_size & ((mp_size_unsigned_t) 7 << 29)) \
106
 
                     | (mp_size_unsigned_t) (n))
107
 
#define MPFR_SIZE(x) ((x)->_mpfr_size)
108
 
#define MPFR_EXP(x) ((x)->_mpfr_exp)
109
 
#define MPFR_MANT(x) ((x)->_mpfr_d)
110
 
#define MPFR_ISNONNEG(x) (MPFR_NOTZERO((x)) && MPFR_SIGN(x) >= 0)
111
 
#define MPFR_ISNEG(x) (MPFR_NOTZERO((x)) && MPFR_SIGN(x) == -1)
112
 
#define MPFR_SET_POS(x) (MPFR_SIZE(x) &= ~(((mp_size_unsigned_t) 1) << 31))
113
 
#define MPFR_SET_NEG(x) (MPFR_SIZE(x) |= (((mp_size_unsigned_t) 1) << 31))
114
 
#define MPFR_CHANGE_SIGN(x) (MPFR_SIZE(x) ^= (((mp_size_unsigned_t) 1) << 31))
115
 
#define MPFR_SET_SAME_SIGN(x, y) \
116
 
  (MPFR_SIGN((x)) != MPFR_SIGN((y)) && (MPFR_CHANGE_SIGN((x)), 0))
117
 
#define MPFR_PREC(x) ((x)->_mpfr_prec)
118
 
#define MPFR_NOTZERO(x) \
119
 
  (MPFR_MANT(x)[(MPFR_PREC(x)-1)/BITS_PER_MP_LIMB] != (mp_limb_t) 0)
120
 
#define MPFR_IS_ZERO(x) \
121
 
  (MPFR_MANT(x)[(MPFR_PREC(x)-1)/BITS_PER_MP_LIMB] == (mp_limb_t) 0)
122
 
#define MPFR_SET_ZERO(x) \
123
 
  (MPFR_MANT(x)[(MPFR_PREC(x)-1)/BITS_PER_MP_LIMB] = (mp_limb_t) 0)
124
 
#define MPFR_ESIZE(x) \
125
 
  ((MPFR_PREC((x)) - 1) / BITS_PER_MP_LIMB + 1); 
126
 
#define MPFR_EVEN_INEX 2
127
 
 
128
 
/* When returning the ternary inexact value, ALWAYS use one of the
129
 
   following two macros, unless the flag comes from another function
130
 
   returning the ternary inexact value */
131
 
#define MPFR_RET(I) return \
132
 
  (I) ? ((__mpfr_flags |= MPFR_FLAGS_INEXACT), (I)) : 0
133
 
#define MPFR_RET_NAN return (__mpfr_flags |= MPFR_FLAGS_NAN), 0
134
 
 
135
 
/* The following macro restores the exponent range and the flags,
136
 
   checks that the result is in the exponent range and returns the
137
 
   ternary inexact value. */
138
 
#define MPFR_RESTORE_RET(inex, x, rnd_mode) \
139
 
  do \
140
 
    { \
141
 
      int inex_cr; \
142
 
      mpfr_restore_emin_emax(); \
143
 
      inex_cr = mpfr_check_range(x, rnd_mode); \
144
 
      if (inex_cr) \
145
 
        return inex_cr; /* underflow or overflow */ \
146
 
      MPFR_RET(inex); \
147
 
    } \
148
 
  while(0)
149
 
 
150
 
/* Memory gestion */
151
 
 
152
 
/* temporary allocate s limbs at xp, and initialize mpfr variable x */
153
 
#define MPFR_INIT(xp, x, p, s) \
154
 
  (xp = (mp_ptr) TMP_ALLOC((size_t) (s) * BYTES_PER_MP_LIMB), \
155
 
   MPFR_PREC(x) = (p), \
156
 
   MPFR_MANT(x) = (xp), \
157
 
   MPFR_SIZE(x) = (s), \
158
 
   MPFR_EXP(x) = 0)
159
 
/* same when xp is already allocated */
160
 
#define MPFR_INIT1(xp, x, p, s) \
161
 
  (MPFR_PREC(x) = (p), MPFR_MANT(x) = (xp), MPFR_SIZE(x) = (s))
162
 
 
163
 
#ifndef _PROTO
164
 
#if defined (__STDC__) || defined (__cplusplus)
165
 
#define _PROTO(x) x
166
 
#else
167
 
#define _PROTO(x) ()
168
 
#endif
169
 
#endif
170
 
 
171
 
#if defined (__cplusplus)
172
 
extern "C" {
173
 
#endif  
174
 
 
175
 
extern mp_prec_t __mpfr_const_log2_prec;
176
 
int mpfr_set_underflow _PROTO ((mpfr_ptr, mp_rnd_t, int));
177
 
int mpfr_set_overflow _PROTO ((mpfr_ptr, mp_rnd_t, int));
178
 
void mpfr_save_emin_emax _PROTO ((void));
179
 
void mpfr_restore_emin_emax _PROTO ((void));
180
 
int mpfr_add1 _PROTO ((mpfr_ptr, mpfr_srcptr, mpfr_srcptr,
181
 
                       mp_rnd_t, mp_exp_unsigned_t));
182
 
int mpfr_sub1 _PROTO ((mpfr_ptr, mpfr_srcptr, mpfr_srcptr,
183
 
                       mp_rnd_t, int));
184
 
int mpfr_round_raw_generic _PROTO ((mp_limb_t *, mp_limb_t *, mp_prec_t, int,
185
 
                                    mp_prec_t, mp_rnd_t, int *, int));
186
 
int mpfr_can_round_raw _PROTO ((mp_limb_t *, mp_size_t, int, mp_exp_t,
187
 
                                mp_rnd_t, mp_rnd_t, mp_prec_t));
188
 
double mpfr_get_d3 _PROTO ((mpfr_srcptr, mp_exp_t, mp_rnd_t));
189
 
int mpfr_cmp_abs _PROTO ((mpfr_srcptr, mpfr_srcptr));
190
 
int mpfr_cmp2 _PROTO ((mpfr_srcptr, mpfr_srcptr, mp_prec_t *));
191
 
long _mpfr_ceil_log2 _PROTO ((double));
192
 
long _mpfr_floor_log2 _PROTO ((double));
193
 
double _mpfr_ceil_exp2 _PROTO ((double));
194
 
unsigned long _mpfr_isqrt _PROTO ((unsigned long));
195
 
unsigned long _mpfr_cuberoot _PROTO ((unsigned long));
196
 
int mpfr_exp_2 _PROTO ((mpfr_ptr, mpfr_srcptr, mp_rnd_t));
197
 
int mpfr_exp3 _PROTO ((mpfr_ptr, mpfr_srcptr, mp_rnd_t));
198
 
 
199
 
#define mpfr_round_raw(yp, xp, xprec, neg, yprec, r, inexp) \
200
 
  mpfr_round_raw_generic((yp), (xp), (xprec), (neg), (yprec), (r), (inexp), 0)
201
 
 
202
 
#define mpfr_round_raw2(xp, xn, neg, r, prec) \
203
 
  mpfr_round_raw_generic(0, (xp), (xn) * BITS_PER_MP_LIMB, (neg), \
204
 
                         (prec), (r), 0, 1); 
205
 
 
206
 
#if defined (__cplusplus)
207
 
}
208
 
#endif