This file is indexed.

/usr/lib/ocaml/apron/mpfr.idl is in libapron-ocaml-dev 0.9.10-7.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
/* -*- mode: c -*- */

/* This file is part of the MLGmpIDL interface, released under LGPL license.
   Please read the COPYING file packaged in the distribution  */

quote(C, "\n\
#include \"caml/custom.h\"\n\
#include \"gmp_caml.h\"\n\
")

import "mpz.idl";
import "mpq.idl";
import "mpf.idl";

typedef [abstract,c2ml(camlidl_mpfr_ptr_c2ml),ml2c(camlidl_mpfr_ptr_ml2c)] struct __mpfr_struct* mpfr_ptr;
quote(MLMLI,"(** MPFR multiprecision floating-point numbers *)\n\n")

typedef [mltype("\n  | Near\n  | Zero\n  | Up\n  | Down"), c2ml(camlidl_mpfr_rnd_t_c2ml),ml2c(camlidl_mpfr_rnd_t_ml2c)] struct mpfr_rnd_t mpfr_rnd_t;

quote(MLMLI,"(** The following operations are mapped as much as possible to their C counterpart. In case of imperative functions (like [set], [add], ...) the first parameter of type [t] is an out-parameter and holds the result when the function returns. For instance, [add x y z] adds the values of [y] and [z] and stores the result in [x].\n\n These functions are as efficient as their C counterpart: they do not imply additional memory allocation. *)\n\n")

/* OUTOUTOUT is a reserved variable name ! (see Makefile and sedscript_c) */

quote(MLI,"\n(** {2 Pretty printing} *)\n")
quote(MLI,"val print : Format.formatter -> t -> unit")
quote(MLI,"val print_round : Format.formatter -> round -> unit")
quote(MLI,"val string_of_round : round -> string")

quote(MLMLI,"\n(** {2 Rounding Modes} *)")
quote(MLMLI,"(** {{:http://www.mpfr.org/mpfr-current/mpfr.html#Rounding-Related-Functions}C documentation} *)\n")

void mpfr_set_default_rounding_mode (mpfr_rnd_t RND);
mpfr_rnd_t mpfr_get_default_rounding_mode (void);

int mpfr_round_prec (mpfr_ptr X, mpfr_rnd_t RND, unsigned long int PREC);

quote(MLMLI,"\n(** {2 Exceptions} *)")
quote(MLMLI,"(** {{:http://www.mpfr.org/mpfr-current/mpfr.html#Exception-Related-Functions}C documentation} *)\n")

long int mpfr_get_emin (void);
long int mpfr_get_emax (void);

void mpfr_set_emin (long int EXP)
  quote(call,"{\n\
int n = mpfr_set_emin(EXP);\n\
if (n){ caml_invalid_argument(\"\"); }\n\
  }");
void mpfr_set_emax (long int EXP)
  quote(call,"{\n\
int n = mpfr_set_emax(EXP);\n\
if (n){ caml_invalid_argument(\"\"); }\n\
  }");

int mpfr_check_range (mpfr_ptr X, int T, mpfr_rnd_t RND);

void mpfr_clear_underflow (void);
void mpfr_clear_overflow (void);
void mpfr_clear_nanflag (void);
void mpfr_clear_inexflag (void);

void mpfr_clear_flags (void);

boolean mpfr_underflow_p (void);
boolean mpfr_overflow_p (void);
boolean mpfr_nanflag_p (void);
boolean mpfr_inexflag_p (void);

quote(MLMLI,"\n(** {2 Initialization Functions} *)")
quote(MLMLI,"(** {{:http://www.mpfr.org/mpfr-current/mpfr.html#Initialization-Functions}C documentation} *)\n")

void mpfr_set_default_prec (unsigned long int PREC);
unsigned long int mpfr_get_default_prec (void);

void mpfr_init ([out] mpfr_ptr OUTOUTOUT);
void mpfr_init2 ([out] mpfr_ptr OUTOUTOUT, unsigned long int PREC);

unsigned long int mpfr_get_prec (mpfr_ptr OP);
void mpfr_set_prec (mpfr_ptr ROP, unsigned long int PREC);
void mpfr_set_prec_raw (mpfr_ptr ROP, unsigned long int PREC);

quote(MLMLI,"\n(** {2 Assignment Functions} *)")
quote(MLMLI,"(** {{:http://www.mpfr.org/mpfr-current/mpfr.html#Assignment-Functions}C documentation} *)\n")
int mpfr_set (mpfr_ptr ROP, mpfr_ptr OP, mpfr_rnd_t RND);
int mpfr_set_si (mpfr_ptr ROP, signed long int OP, mpfr_rnd_t RND);
int mpfr_set_d (mpfr_ptr ROP, double OP, mpfr_rnd_t RND);
int mpfr_set_z (mpfr_ptr ROP, mpz_ptr OP, mpfr_rnd_t RND);
int mpfr_set_q (mpfr_ptr ROP, mpq_ptr OP, mpfr_rnd_t RND);
void mpfr__set_str (mpfr_ptr ROP, [string]char *STR, int BASE, mpfr_rnd_t RND)
  quote(call,"{\n\
  int n = mpfr_set_str(ROP,STR,BASE,RND);\n\
  if (n){ mpfr_clear(ROP); caml_invalid_argument(\"\"); }\n\
  }");
quote(MLI,"val set_str : t -> string -> base:int -> mpfr_rnd_t -> unit")
quote(ML,"let set_str a b ~base round = _set_str a b base round")
int mpfr_set_f (mpfr_ptr X, mpf_ptr Y, mpfr_rnd_t RND);
int mpfr_set_si_2exp (mpfr_ptr ROP, signed long int OP, signed long int EXPNT, mpfr_rnd_t RND);
void mpfr_set_inf (mpfr_ptr X, int SIGN);
void mpfr_set_nan (mpfr_ptr X);

void mpfr_swap (mpfr_ptr ROP1, mpfr_ptr ROP2);

quote(MLMLI,"\n(** {2 Combined Initialization and Assignment Functions} *)")
quote(MLMLI,"(** {{:http://www.mpfr.org/mpfr-current/mpfr.html#Combined-Initialization-and-Assignment-Functions}C documentation} *)\n")
int mpfr_init_set ([out] mpfr_ptr OUTOUTOUT, mpfr_ptr OP, mpfr_rnd_t RND);
int mpfr_init_set_si ([out] mpfr_ptr OUTOUTOUT, signed long int OP, mpfr_rnd_t RND);
int mpfr_init_set_d ([out] mpfr_ptr OUTOUTOUT, double OP, mpfr_rnd_t RND);
int mpfr_init_set_f ([out] mpfr_ptr OUTOUTOUT, mpf_ptr OP, mpfr_rnd_t RND);
int mpfr_init_set_z ([out] mpfr_ptr OUTOUTOUT, mpz_ptr OP, mpfr_rnd_t RND);
int mpfr_init_set_q ([out] mpfr_ptr OUTOUTOUT, mpq_ptr OP, mpfr_rnd_t RND);
void mpfr__init_set_str ([out] mpfr_ptr OUTOUTOUT, [string]char *STR, int BASE, mpfr_rnd_t RND)
     quote(call,"\
  {\n\
  int n = mpfr_init_set_str(OUTOUTOUT,STR,BASE,RND);\n\
  if (n){ mpfr_clear(OUTOUTOUT); caml_invalid_argument(\"\"); }\n\
  }");
quote(MLI,"val init_set_str : string -> base:int -> mpfr_rnd_t -> t")
quote(ML,"let init_set_str a ~base round = _init_set_str a base round")

quote(MLMLI,"\n(** {2 Conversion Functions} *)")
quote(MLMLI,"(** {{:http://www.mpfr.org/mpfr-current/mpfr.html#Conversion-Functions}C documentation} *)\n")

double mpfr_get_d (mpfr_ptr OP, mpfr_rnd_t RND);
double mpfr_get_d1 (mpfr_ptr OP);
int mpfr_get_z_exp (mpz_ptr Z, mpfr_ptr OP);
void mpfr_get_z (mpz_ptr Z, mpfr_ptr OP, mpfr_rnd_t RND);

[string]char* mpfr__get_str ([out]long int *EXPPTR, int BASE, int N_DIGITS, mpfr_ptr OP, mpfr_rnd_t RND)
  quote(call,"_res = mpfr_get_str(NULL,EXPPTR,BASE,N_DIGITS,OP,RND);")
  quote(dealloc,"free(_res);");
quote(MLI,"val get_str : base:int -> digits:int -> t -> mpfr_rnd_t -> string * int")
quote(ML,"let get_str ~base ~digits a round = _get_str base digits a round")

quote(MLI,"\n(** {2 User Conversions} *)\n")

quote(MLI,"(** These functionss are additions to or renaming of functions offered by the C library. *)\n")

quote(MLI,"val to_string : t -> string")
quote(MLI,"val to_float : ?round:round -> t -> float")
quote(MLI,"val to_mpq : t -> Mpq.t")
quote(MLI,"val of_string : string -> round -> t")
quote(MLI,"val of_float : float -> round -> t")
quote(MLI,"val of_int : int -> round -> t")
quote(MLI,"val of_frac : int -> int -> round -> t")
quote(MLI,"val of_mpz : Mpz.t -> round -> t")
quote(MLI,"val of_mpz2 : Mpz.t -> Mpz.t -> round -> t")
quote(MLI,"val of_mpq : Mpq.t -> round -> t")

quote(MLMLI,"\n(** {2 Basic Arithmetic Functions} *)")
quote(MLMLI,"(** {{:http://www.mpfr.org/mpfr-current/mpfr.html#Basic-Arithmetic-Functions}C documentation} *)\n")
int mpfr_add (mpfr_ptr ROP, mpfr_ptr OP1, mpfr_ptr OP2, mpfr_rnd_t RND);
int mpfr_add_ui (mpfr_ptr ROP, mpfr_ptr OP1, unsigned long int OP2, mpfr_rnd_t RND);
int mpfr_add_z (mpfr_ptr ROP, mpfr_ptr OP1, mpz_ptr OP2, mpfr_rnd_t RND);
int mpfr_add_q (mpfr_ptr ROP, mpfr_ptr OP1, mpq_ptr OP2, mpfr_rnd_t RND);
int mpfr_sub (mpfr_ptr ROP, mpfr_ptr OP1, mpfr_ptr OP2, mpfr_rnd_t RND);
int mpfr_ui_sub (mpfr_ptr ROP, unsigned long int OP1, mpfr_ptr OP2, mpfr_rnd_t RND);
int mpfr_sub_ui (mpfr_ptr ROP, mpfr_ptr OP1, unsigned long int OP2, mpfr_rnd_t RND);
int mpfr_sub_z (mpfr_ptr ROP, mpfr_ptr OP1, mpz_ptr OP2, mpfr_rnd_t RND);
int mpfr_sub_q (mpfr_ptr ROP, mpfr_ptr OP1, mpq_ptr OP2, mpfr_rnd_t RND);
int mpfr_mul (mpfr_ptr ROP, mpfr_ptr OP1, mpfr_ptr OP2, mpfr_rnd_t RND);
int mpfr_mul_ui (mpfr_ptr ROP, mpfr_ptr OP1, unsigned long int OP2, mpfr_rnd_t RND);
int mpfr_mul_z (mpfr_ptr ROP, mpfr_ptr OP1, mpz_ptr OP2, mpfr_rnd_t RND);
int mpfr_mul_q (mpfr_ptr ROP, mpfr_ptr OP1, mpq_ptr OP2, mpfr_rnd_t RND);
int mpfr_mul_2ui (mpfr_ptr ROP, mpfr_ptr OP1, unsigned long int OP2, mpfr_rnd_t RND);
int mpfr_mul_2si (mpfr_ptr ROP, mpfr_ptr OP1, long int OP2, mpfr_rnd_t RND);
int mpfr_mul_2exp (mpfr_ptr ROP, mpfr_ptr OP1, unsigned long int OP2, mpfr_rnd_t RND);
int mpfr_div (mpfr_ptr ROP, mpfr_ptr OP1, mpfr_ptr OP2, mpfr_rnd_t RND);
int mpfr_ui_div (mpfr_ptr ROP, unsigned long int OP1, mpfr_ptr OP2, mpfr_rnd_t RND);
int mpfr_div_ui (mpfr_ptr ROP, mpfr_ptr OP1, unsigned long int OP2, mpfr_rnd_t RND);
int mpfr_div_z (mpfr_ptr ROP, mpfr_ptr OP1, mpz_ptr OP2, mpfr_rnd_t RND);
int mpfr_div_q (mpfr_ptr ROP, mpfr_ptr OP1, mpq_ptr OP2, mpfr_rnd_t RND);
int mpfr_div_2ui (mpfr_ptr ROP, mpfr_ptr OP1, unsigned long int OP2, mpfr_rnd_t RND);
int mpfr_div_2si (mpfr_ptr ROP, mpfr_ptr OP1, long int OP2, mpfr_rnd_t RND);
quote(MLI,"val div_2exp : t -> t -> int -> mpfr_rnd_t -> int")
quote(ML,"let div_2exp = div_2ui")
boolean mpfr_sqrt (mpfr_ptr ROP, mpfr_ptr OP, mpfr_rnd_t RND);
boolean mpfr_sqrt_ui (mpfr_ptr ROP, unsigned long int OP, mpfr_rnd_t RND);
boolean mpfr_pow_ui (mpfr_ptr ROP, mpfr_ptr OP1, unsigned long int OP2, mpfr_rnd_t RND);
boolean mpfr_pow_si (mpfr_ptr ROP, mpfr_ptr OP1, signed long int OP2, mpfr_rnd_t RND);
boolean mpfr_ui_pow_ui (mpfr_ptr ROP, unsigned long int OP1, unsigned long int OP2, mpfr_rnd_t RND);
boolean mpfr_ui_pow (mpfr_ptr ROP, unsigned long int OP1, mpfr_ptr OP2, mpfr_rnd_t RND);
boolean mpfr_pow (mpfr_ptr ROP, mpfr_ptr OP1, mpfr_ptr OP2, mpfr_rnd_t RND);
int mpfr_neg (mpfr_ptr ROP, mpfr_ptr OP, mpfr_rnd_t RND);
int mpfr_abs (mpfr_ptr ROP, mpfr_ptr OP, mpfr_rnd_t RND);

quote(MLMLI,"\n(** {2 Comparison Functions} *)")
quote(MLMLI,"(** {{:http://www.mpfr.org/mpfr-current/mpfr.html#Comparison-Functions}C documentation} *)\n")
int mpfr_cmp (mpfr_ptr OP1, mpfr_ptr OP2);
int mpfr_cmp_si (mpfr_ptr OP1, signed long int OP2);
int mpfr_cmp_si_2exp (mpfr_ptr OP1, long int OP2, int E);
int mpfr_sgn (mpfr_ptr OP);
boolean mpfr__equal (mpfr_ptr OP1, mpfr_ptr OP2,  unsigned long int OP3)
  quote(call,"_res=mpfr_eq(OP1,OP2,OP3);");
quote(MLI,"val equal : t -> t -> bits:int -> bool")
quote(ML,"let equal a b ~bits = _equal a b bits")
boolean mpfr_nan_p (mpfr_ptr OP);
boolean mpfr_inf_p (mpfr_ptr OP);
boolean mpfr_number_p (mpfr_ptr OP);
void mpfr_reldiff (mpfr_ptr ROP, mpfr_ptr OP1, mpfr_ptr OP2, mpfr_rnd_t RND);

quote(MLMLI,"\n(** {2 Special Functions} *)")
quote(MLMLI,"(** {{:http://www.mpfr.org/mpfr-current/mpfr.html#Special-Functions}C documentation} *)\n")
int mpfr_log (mpfr_ptr ROP, mpfr_ptr OP, mpfr_rnd_t RND);
int mpfr_log2 (mpfr_ptr ROP, mpfr_ptr OP, mpfr_rnd_t RND);
int mpfr_log10 (mpfr_ptr ROP, mpfr_ptr OP, mpfr_rnd_t RND);
int mpfr_exp (mpfr_ptr ROP, mpfr_ptr OP, mpfr_rnd_t RND);
int mpfr_exp2 (mpfr_ptr ROP, mpfr_ptr OP, mpfr_rnd_t RND);
int mpfr_exp10 (mpfr_ptr ROP, mpfr_ptr OP, mpfr_rnd_t RND);

int mpfr_cos (mpfr_ptr COP, mpfr_ptr OP, mpfr_rnd_t RND);
int mpfr_sin (mpfr_ptr SOP, mpfr_ptr OP, mpfr_rnd_t RND);
int mpfr_tan (mpfr_ptr TOP, mpfr_ptr OP, mpfr_rnd_t RND);
int mpfr_sec (mpfr_ptr COP, mpfr_ptr OP, mpfr_rnd_t RND);
int mpfr_csc (mpfr_ptr SOP, mpfr_ptr OP, mpfr_rnd_t RND);
int mpfr_cot (mpfr_ptr TOP, mpfr_ptr OP, mpfr_rnd_t RND);
boolean mpfr_sin_cos (mpfr_ptr SOP, mpfr_ptr COP, mpfr_ptr OP, mpfr_rnd_t RND);

int mpfr_acos (mpfr_ptr ROP, mpfr_ptr OP, mpfr_rnd_t RND);
int mpfr_asin (mpfr_ptr ROP, mpfr_ptr OP, mpfr_rnd_t RND);
int mpfr_atan (mpfr_ptr ROP, mpfr_ptr OP, mpfr_rnd_t RND);

int mpfr_atan2 (mpfr_ptr ROP, mpfr_ptr Y, mpfr_ptr X, mpfr_rnd_t RND);

int mpfr_cosh (mpfr_ptr COP, mpfr_ptr OP, mpfr_rnd_t RND);
int mpfr_sinh (mpfr_ptr SOP, mpfr_ptr OP, mpfr_rnd_t RND);
int mpfr_tanh (mpfr_ptr TOP, mpfr_ptr OP, mpfr_rnd_t RND);

int mpfr_sech (mpfr_ptr COP, mpfr_ptr OP, mpfr_rnd_t RND);
int mpfr_csch (mpfr_ptr SOP, mpfr_ptr OP, mpfr_rnd_t RND);
int mpfr_coth (mpfr_ptr TOP, mpfr_ptr OP, mpfr_rnd_t RND);

int mpfr_acosh (mpfr_ptr ROP, mpfr_ptr OP, mpfr_rnd_t RND);
int mpfr_asinh (mpfr_ptr ROP, mpfr_ptr OP, mpfr_rnd_t RND);
int mpfr_atanh (mpfr_ptr ROP, mpfr_ptr OP, mpfr_rnd_t RND);

int mpfr_fac_ui (mpfr_ptr ROP, unsigned long int OP, mpfr_rnd_t RND);

int mpfr_log1p (mpfr_ptr ROP, mpfr_ptr OP, mpfr_rnd_t RND);

int mpfr_expm1 (mpfr_ptr ROP, mpfr_ptr OP, mpfr_rnd_t RND);

int mpfr_eint (mpfr_ptr Y, mpfr_ptr X, mpfr_rnd_t RND);

int mpfr_gamma (mpfr_ptr ROP, mpfr_ptr OP, mpfr_rnd_t RND);

int mpfr_lngamma (mpfr_ptr ROP, mpfr_ptr OP, mpfr_rnd_t RND);

int mpfr_zeta (mpfr_ptr ROP, mpfr_ptr OP, mpfr_rnd_t RND);

int mpfr_erf (mpfr_ptr ROP, mpfr_ptr OP, mpfr_rnd_t RND);

int mpfr_erfc (mpfr_ptr ROP, mpfr_ptr OP, mpfr_rnd_t RND);

int mpfr_fma (mpfr_ptr ROP, mpfr_ptr OPX,mpfr_ptr OPY, mpfr_ptr OPZ, mpfr_rnd_t RND);

int mpfr_agm (mpfr_ptr ROP, mpfr_ptr OP1, mpfr_ptr OP2, mpfr_rnd_t RND);

int mpfr_hypot (mpfr_ptr ROP, mpfr_ptr X, mpfr_ptr Y, mpfr_rnd_t RND);

int mpfr_const_log2 (mpfr_ptr ROP, mpfr_rnd_t RND);
int mpfr_const_pi (mpfr_ptr ROP, mpfr_rnd_t RND);
int mpfr_const_euler (mpfr_ptr ROP, mpfr_rnd_t RND);
int mpfr_const_catalan (mpfr_ptr ROP, mpfr_rnd_t RND);

quote(MLMLI,"\n(** {2 Input and Output Functions: not interfaced} *)\n")

quote(MLMLI,"\n(** {2 Miscellaneous Float Functions} *)")
quote(MLMLI,"(** {{:http://www.mpfr.org/mpfr-current/mpfr.html#Rounding-Related-Functions}C documentation} *)\n")
int mpfr_rint (mpfr_ptr ROP, mpfr_ptr OP, mpfr_rnd_t RND);
int mpfr_ceil (mpfr_ptr ROP, mpfr_ptr OP);
int mpfr_floor (mpfr_ptr ROP, mpfr_ptr OP);
int mpfr_round (mpfr_ptr ROP, mpfr_ptr OP);
int mpfr_trunc (mpfr_ptr ROP, mpfr_ptr OP);
boolean mpfr_integer_p (mpfr_ptr OP);
void mpfr_nexttoward (mpfr_ptr X, mpfr_ptr Y);
void mpfr_nextabove (mpfr_ptr X);
void mpfr_nextbelow (mpfr_ptr X);
int mpfr_min (mpfr_ptr ROP, mpfr_ptr OP1, mpfr_ptr OP2, mpfr_rnd_t RND);
int mpfr_max (mpfr_ptr ROP, mpfr_ptr OP1, mpfr_ptr OP2, mpfr_rnd_t RND);
int mpfr_get_exp (mpfr_ptr X);
int mpfr_set_exp (mpfr_ptr X, signed long int E);

quote(ML,"\n(** {2 Additional functions} *)\n")
quote(ML,"let to_string x = \n\
let (s,e) = get_str ~base:10 ~digits:0 x Near in \n\
if s=\"\" \n\
then \"0.0\" \n\
else Format.sprintf \"0.%sE%i\" s e \n\
")

quote(ML,"\n(** {2 Pretty printing} *)\n")
quote(ML,"let print fmt x = \n\
let (s,e) = get_str ~base:10 ~digits:0 x Near in \n\
if s=\"\" \n\
then Format.pp_print_string fmt \"0.0\" \n\
else Format.fprintf fmt \"0.%sE%i\" s e \n\
\n\
let string_of_round = function\n\
| Near -> \"Near\"\n\
| Zero -> \"Zero\"\n\
| Up -> \"Up\"\n\
| Down -> \"Down\"\n\
let print_round fmt x = Format.pp_print_string fmt (string_of_round x)\n\
")

quote(ML,"let to_float ?round x = \n\
  match round with\n\
  | None -> get_d1 x\n\
  | Some r -> get_d x r\n\
")
quote(ML,"let to_mpq x = \n\
   let num,den = Mpz.init(), Mpz.init_set_si 1 in\n\
   let e = get_z_exp num x in\n\
   Mpz.mul_2exp den den e;\n\
   Mpq.of_mpz2 num den\n\
")
quote(ML,"let of_int x r = snd (init_set_si x r)")
quote(ML,"let of_float x r = snd (init_set_d x r)")
quote(ML,"let of_mpz x r = snd (init_set_z x r)")
quote(ML,"let of_mpq x r = snd (init_set_q x r)")
quote(ML,"let of_string x r = init_set_str x ~base:10 r")
quote(ML,"let of_frac n d r = let mpq = Mpq.of_frac n d in of_mpq mpq r")
quote(ML,"let of_mpz2 n d r = let mpq = Mpq.of_mpz2 n d in of_mpq mpq r")