File: gmptools.h

package info (click to toggle)
mpsolve 3.2.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 13,100 kB
  • sloc: ansic: 25,748; sh: 4,925; cpp: 3,155; makefile: 914; python: 407; yacc: 158; lex: 85; xml: 41
file content (147 lines) | stat: -rw-r--r-- 4,683 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/***********************************************************
**                       GMP Tools                        **
**                      Version 2.0                       **
**                                                        **
**             Written by Giuseppe Fiorentino             **
**                 (fiorent@dm.unipi.it)                  **
***********************************************************/

/**
 * @file
 * @brief Additional functions used to complete the GMP package with what
 * is needed in MPSolve.
 */

#ifndef __GMPTOOLS_H__
#define __GMPTOOLS_H__

#include <gmp.h>
#include <stdio.h>

#ifdef __cplusplus
extern "C"
{
#endif

/**********************************************
*                  MPZ_T                      *
**********************************************/

#define mpz_Val(Z)              (*Z)
#define mpz_Move(Z1, Z2)        (*Z1 = *Z2)

/* missing functions */
#ifndef mpz_swap
void mpz_swap (mpz_t z1, mpz_t z2);
#endif
#ifndef mpz_tstbit
int mpz_tstbit (mpz_t z, unsigned long int pos);
#endif
#define mpz_get_bit(Z, N)       mpz_tstbit (Z, N)

#define mpz_mul_eq(Z1, Z2)      mpz_mul (Z1, Z1, Z2)
#define mpz_add_eq(Z1, Z2)      mpz_add (Z1, Z1, Z2)

/* vector support functions */
#define mpz_valloc(N)         (mpz_t*)malloc ((N)*sizeof(mpz_t))
void mpz_vinit (mpz_t v[], unsigned long int size);
void mpz_vclear (mpz_t v[], unsigned long int size);
#define mpz_vfree(V)          free (V)

/**********************************************
*                  MPQ_T                      *
**********************************************/

#define mpq_Val(Q)            (*Q)
#define mpq_Move(Q1, Q2)      (*Q1 = *Q2)

/* missing functions */
#ifndef mpq_swap
void mpq_swap (mpq_t q1, mpq_t q2);
#endif

/* I/O */
#ifndef mpq_out_str
void mpq_out_str (FILE * stream, int base, mpq_t q);
#endif

/* vector support functions */
#define mpq_valloc(N)         (mpq_t*)malloc ((N)*sizeof(mpq_t))
void mpq_vinit (mpq_t v[], unsigned long int size);
void mpq_vclear (mpq_t v[], unsigned long int size);
#define mpq_vfree(V)          free (V)

/**********************************************
*                  MPF_T                      *
**********************************************/

#define mpf_Val(F)            (*F)
#define mpf_Move(F1, F2)      (*F1 = *F2)

/* missing functions */
#ifndef mpf_swap
void mpf_swap (mpf_t f1, mpf_t f2);
#endif
void mpf_set_2dl (mpf_t f, double d, long int l);
void mpf_get_2dl (double *d, long int *l, mpf_t f);
long int mpf_size_2 (mpf_t f);

/* missing operators */
#define mpf_inv(R, F)         mpf_ui_div (R, 1, F)
#define mpf_sqr(R, F)         mpf_mul (R, F, F)
void mpf_add_si (mpf_t r, mpf_t f, long int i);
void mpf_sub_si (mpf_t r, mpf_t f, long int i);
void mpf_si_sub (mpf_t r, long int i, mpf_t f);
void mpf_mul_si (mpf_t r, mpf_t f, long int i);
void mpf_div_si (mpf_t r, mpf_t f, long int i);
#ifndef mpf_pow_ui
void mpf_pow_ui (mpf_t r, mpf_t f, unsigned long int i);
#endif
void mpf_pow_si (mpf_t r, mpf_t f, long int i);

/* op= style operators for mpf_t */
#define mpf_neg_eq(F)         mpf_neg (F, F)
#define mpf_inv_eq(F)         mpf_ui_div (F, 1, F)
#define mpf_sqr_eq(F)         mpf_mul (F, F, F)
#define mpf_sqrt_eq(F)        mpf_sqrt (F, F)
#define mpf_add_eq(F1, F2)    mpf_add (F1, F1, F2)
#define mpf_add_eq_ui(F, I)   mpf_add_ui (F, F, I)
#define mpf_add_eq_si(F, I)   mpf_add_si (F, F, I)
#define mpf_sub_eq(F1, F2)    mpf_sub (F1, F1, F2)
#define mpf_sub_eq_ui(F, I)   mpf_sub_ui (F, F, I)
#define mpf_sub_eq_si(F, I)   mpf_sub_si (F, F, I)
#define mpf_ui_sub_eq(F, I)   mpf_ui_sub (F, I, F)
#define mpf_si_sub_eq(F, I)   mpf_si_sub (F, I, F)
#define mpf_mul_eq(F1, F2)    mpf_mul (F1, F1, F2)
#define mpf_mul_eq_ui(F, I)   mpf_mul_ui (F, F, I)
#define mpf_mul_eq_si(F, I)   mpf_mul_si (F, F, I)
#define mpf_mul_eq_2exp(F, I) mpf_mul_2exp (F, F, I)
#define mpf_div_eq(F1, F2)    mpf_div (F1, F1, F2)
#define mpf_div_eq_ui(F, I)   mpf_div_ui (F, F, I)
#define mpf_div_eq_si(F, I)   mpf_div_si (F, F, I)
#define mpf_ui_div_eq(F, I)   mpf_ui_div (F, I, F)
#define mpf_si_div_eq(F, I)   mpf_si_div (F, I, F)
#define mpf_div_eq_2exp(F, I) mpf_div_2exp (F, F, I)
#define mpf_pow_eq_si(F, I)   mpf_pow_si (F, F, I)

#define mpf_is_zero_p(F)      (mpf_sgn (F) ? 0 : 1)

/* vector support functions */
#define mpf_valloc(N)         (mpf_t*)malloc ((N)*sizeof(mpf_t))
void mpf_vinit (mpf_t v[], unsigned long int size);
void mpf_vinit2 (mpf_t v[], unsigned long int size, unsigned long int prec);
void mpf_vclear (mpf_t v[], unsigned long int size);
#define mpf_vfree(V)          free (V)



/*
 * End of extern "C" {
 *   ...
 * }
 */
#ifdef __cplusplus
}
#endif

#endif