srawlins-gmp 0.1.4.2 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (6) hide show
  1. data/README.rdoc +21 -18
  2. data/ext/gmp.c +17 -216
  3. data/ext/gmpf.h +11 -309
  4. data/ext/gmpq.h +8 -482
  5. data/ext/gmpz.h +5 -818
  6. metadata +1 -1
data/README.rdoc CHANGED
@@ -46,16 +46,19 @@ paragraph at http://gmplib.org/#WHAT :
46
46
  contributions, meaning users can safely use GMP. To achieve this, we will ask
47
47
  contributors to sign paperwork where they allow us to distribute their work."
48
48
 
49
- Only GMP 4 or newer is supported. It has been officially tested with:
50
- |-------------------------------------|
51
- | Platform | Ruby | GMP |
52
- |---------------|---------|-----------|
53
- | Cygwin on x86 | 1.8.6 | GMP 4.3.1 |
54
- |-------------------------------------|
49
+ Only GMP 4 or newer is supported. The following environments have been tested by me:
50
+ gmp gem 0.1.4.2 on:
51
+ +-----------------+---------+-----------+
52
+ | Platform | Ruby | GMP |
53
+ +-----------------+---------+-----------+
54
+ | Cygwin on x86 | 1.8.7 | GMP 4.3.1 |
55
+ | Mac OS X 10.5.7 | 1.8.6 | GMP 4.3.1 |
56
+ +-----------------+---------+-----------+
55
57
 
56
- I have not tested one wit on Ruby 1.9.x, but my educated guess is, no, it
57
- does not behave. If only because of rubyio.h replacing ruby/io.h. This is on my
58
- todo list. I intend to use RMagick as a guide.
58
+ <b>Note:</b> I have tried with Ruby 1.9.1. No go.
59
+
60
+ <b>Note:</b> To get this running on Mac OS X, I compiled GMP 4.3.1 with:
61
+ ./configure ABI=32 --disable-dependency-tracking
59
62
 
60
63
  =Authors
61
64
 
@@ -121,11 +124,11 @@ You can also call them as:
121
124
  may have different precisions, which would make
122
125
  them unswapable
123
126
  GMP::Z
124
- add! in-place addition
125
- sub! in-place subtraction
127
+ .add! in-place addition
128
+ .sub! in-place subtraction
126
129
  tdiv,fdiv,cdiv truncate, floor and ceil division
127
130
  tmod,fmod,cmod truncate, floor and ceil modulus
128
- [],[]= testing and setting bits (as booleans)
131
+ .[],[]= testing and setting bits (as booleans)
129
132
  scan0,scan1 starting at bitnr (1st arg), scan for a 0 or 1
130
133
  (respectively), then return the index of the
131
134
  first instance.
@@ -219,19 +222,19 @@ still relevant.
219
222
  * ruby 1.9.x
220
223
  * mpz_fits_* and 31 vs. 32 integer variables
221
224
  * all appropriate module and class methods if there are any to add
222
- * fix all sign issues
225
+ * fix all sign issues (don't know what these are)
223
226
  * floats with precision control
224
227
  * random numbers
225
- * to_s vs. inspect ?
228
+ * to_s vs. inspect
226
229
  * to_s_hex(), or more-ruby-ish, to_s(:hex)
227
230
  * check if mpz_addmul_ui would optimize some statements
228
231
  * some system that allow using denref and numref as normal ruby objects
229
- * should we allocate global temporary variables like Perl GMP do ?
232
+ * should we allocate global temporary variables like Perl GMP does?
230
233
  * takeover code that replaces all Bignums with GMP::Z
231
234
  * better bignum parser
232
235
  * zero-copy method for strings generation
233
- * what should be ancestors of GMP::* classes ?
234
- * division and modulo
236
+ * what should be ancestors of GMP::* classes?
237
+ * division and modulo (que?)
235
238
  * put rb_raise into nice macros
236
239
  * benchmarks against Python GMP and Perl GMP
237
240
  * dup methods
@@ -242,7 +245,7 @@ still relevant.
242
245
  * check asm output, especially local memory efficiency
243
246
  * it might be better to use `register' for some local variables
244
247
  * powm with negative exponents
245
- * check if different sorting of operatations gives better cache usage,
248
+ * check if different sorting of operatations gives better cache usage
246
249
  * GMP::* op RubyFloat and RubyFloat op GMP::*
247
250
  * sort checks
248
251
  * check all new GMP4 operations
data/ext/gmp.c CHANGED
@@ -4,85 +4,15 @@
4
4
  * This file contains everything you would expect from a C extension.
5
5
  */
6
6
 
7
- #define _GNU_SOURCE
8
- #include <stdio.h>
9
-
10
- #include <ruby.h>
11
- #include <gmp.h>
12
-
13
- #ifdef MPFR
14
-
15
- #ifdef HAVE_MPFR_H
16
- #include <mpfr.h>
17
- #endif /* HAVE_MPFR_H */
18
-
19
- #ifdef HAVE_MPF2MPFR_H
20
- #include <mpf2mpfr.h>
21
- #endif /* HAVE_MPF2MPFR_H */
22
-
23
- #endif /* MPFR */
24
-
25
- #include <stdlib.h>
26
-
27
- /*
28
- MP_INT*, MP_RAT* and MP_FLOAT* are used because they don't have side-effects
29
- of single-element arrays mp*_t
30
-
31
- MP_FLOAT is defined here, as it's commented out in gmp.h
32
- */
33
- #if defined(MPFR) && defined(HAVE_MPFR_H)
34
- typedef __mpfr_struct MP_FLOAT;
35
- #else
36
- typedef __mpf_struct MP_FLOAT;
37
- #endif /* HAVE_MPF2MPFR_H */
38
-
39
- #define mpz_get_struct(ruby_var,c_var) { Data_Get_Struct(ruby_var, MP_INT, c_var); }
40
- #define mpq_get_struct(ruby_var,c_var) { Data_Get_Struct(ruby_var, MP_RAT, c_var); }
41
- #define mpf_get_struct(ruby_var,c_var) { Data_Get_Struct(ruby_var, MP_FLOAT, c_var); }
42
- #define mpf_get_struct_prec(ruby_var,c_var,prec) { mpf_get_struct(ruby_var,c_var); prec = mpf_get_prec(c_var); }
43
- #define mpz_make_struct(ruby_var,c_var) { ruby_var = Data_Make_Struct(cGMP_Z, MP_INT, 0, r_gmpz_free, c_var); }
44
- #define mpq_make_struct(ruby_var,c_var) { ruby_var = Data_Make_Struct(cGMP_Q, MP_RAT, 0, r_gmpq_free, c_var); }
45
- #define mpf_make_struct(ruby_var,c_var) { ruby_var = Data_Make_Struct(cGMP_F, MP_FLOAT, 0, r_gmpf_free, c_var); }
46
- #define mpz_make_struct_init(ruby_var,c_var) { mpz_make_struct(ruby_var,c_var); mpz_init (c_var); }
47
- #define mpq_make_struct_init(ruby_var,c_var) { mpq_make_struct(ruby_var,c_var); mpq_init (c_var); }
48
- #define mpf_make_struct_init(ruby_var,c_var,prec) { mpf_make_struct(ruby_var,c_var); mpf_init2 (c_var,prec); }
49
- #define BIGNUM_P(value) (TYPE(value) == T_BIGNUM)
50
- #define FLOAT_P(value) (TYPE(value) == T_FLOAT)
51
- #define STRING_P(value) (TYPE(value) == T_STRING)
52
- #define GMPZ_P(value) (rb_obj_is_instance_of(value, cGMP_Z) == Qtrue)
53
- #define GMPQ_P(value) (rb_obj_is_instance_of(value, cGMP_Q) == Qtrue)
54
- #define GMPF_P(value) (rb_obj_is_instance_of(value, cGMP_F) == Qtrue)
55
- #define mpz_set_bignum(var_mpz,var_bignum) \
56
- mpz_set_str (var_mpz, STR2CSTR (rb_funcall (var_bignum, rb_intern ("to_s"), 0)), 0);
57
- #define mpz_temp_alloc(var) { var=malloc(sizeof(MP_INT)); }
58
- #define mpz_temp_init(var) { mpz_temp_alloc(var); mpz_init(var); }
59
- #define mpz_temp_from_bignum(var,var_bignum) \
60
- { mpz_temp_alloc(var); mpz_init_set_str (var, STR2CSTR (rb_funcall (var_bignum, rb_intern ("to_s"), 0)), 0); }
61
- #define mpz_temp_free(var) { mpz_clear(var); free(var); }
62
- #define mpf_temp_alloc(var) { var=malloc(sizeof(MP_FLOAT)); }
63
- #define mpf_temp_init(var,prec) { mpf_temp_alloc(var); mpf_init2(var,prec); }
64
- #define mpf_temp_free(var) { mpf_clear(var); free(var); }
65
- #define FLT2DBL(var) (RFLOAT(var)->value)
66
- #define prec_max(prec,var) {if(mpf_get_prec(var) > prec) prec = mpf_get_prec(var); }
67
-
68
- #define EXPECTED_ZQFXBD "Expected GMP::Z, GMP::Q, GMP::F, FixNum, BigNum or Float"
69
- #define EXPECTED_ZQFXB "Expected GMP::Z, GMP::Q, GMP::F, FixNum or BigNum"
70
- #define EXPECTED_ZXB "Expected GMP::Z, FixNum or BigNum"
71
- #define EXPECTED_ZX "Expected GMP::Z or FixNum"
72
- #define EXPECTED_X "Expected FixNum"
73
- #define typeerror(expected) rb_raise(rb_eTypeError, EXPECTED_##expected)
74
- #define typeerror_as(expected, argname) rb_raise(rb_eTypeError, EXPECTED_##expected " as " argname)
75
-
76
- //should change exception type
77
- #define not_yet rb_raise(rb_eTypeError,"Not implemented yet")
7
+ #include <ruby_gmp.h>
78
8
 
79
9
  VALUE mGMP, cGMP_Z, cGMP_Q, cGMP_F;
80
10
 
81
- static void r_gmpz_free(void *ptr) { mpz_clear (ptr); free (ptr); }
82
- static void r_gmpq_free(void *ptr) { mpq_clear (ptr); free (ptr); }
83
- static void r_gmpf_free(void *ptr) { mpf_clear (ptr); free (ptr); }
11
+ void r_gmpz_free(void *ptr) { mpz_clear (ptr); free (ptr); }
12
+ void r_gmpq_free(void *ptr) { mpq_clear (ptr); free (ptr); }
13
+ void r_gmpf_free(void *ptr) { mpf_clear (ptr); free (ptr); }
84
14
 
85
- static VALUE r_gmpzsg_new(int argc, VALUE *argv, VALUE klass)
15
+ VALUE r_gmpzsg_new(int argc, VALUE *argv, VALUE klass)
86
16
  {
87
17
  MP_INT *res_val;
88
18
  VALUE res;
@@ -133,24 +63,6 @@ static VALUE r_gmpfsg_new(int argc, VALUE *argv, VALUE klass)
133
63
  return res;
134
64
  }
135
65
 
136
- static void mpz_set_value(MP_INT *target, VALUE source)
137
- {
138
- MP_INT *source_val;
139
-
140
- if (GMPZ_P(source)) {
141
- mpz_get_struct(source, source_val);
142
- mpz_set (target, source_val);
143
- } else if (FIXNUM_P(source)) {
144
- mpz_set_si (target, NUM2INT(source));
145
- } else if (STRING_P(source)) {
146
- mpz_set_str (target, STR2CSTR(source), 0);
147
- } else if (BIGNUM_P(source)) {
148
- mpz_set_bignum(target, source);
149
- } else {
150
- rb_raise (rb_eTypeError, "Don't know how to convert %s into GMP_Z", rb_class2name(rb_class_of(source)));
151
- }
152
- }
153
-
154
66
  static VALUE r_gmpz_initialize(int argc, VALUE *argv, VALUE self)
155
67
  {
156
68
  MP_INT *self_val;
@@ -206,16 +118,16 @@ static VALUE r_gmpq_initialize(int argc, VALUE *argv, VALUE self)
206
118
  }
207
119
 
208
120
  /* don't pass GMP::F here, it should be handled separately */
209
- static void mpf_set_value(MP_FLOAT *self_val, VALUE arg)
121
+ void mpf_set_value(MP_FLOAT *self_val, VALUE arg)
210
122
  {
211
123
  MP_RAT *arg_val_q;
212
124
  MP_INT *arg_val_z;
213
125
 
214
126
  if (GMPQ_P(arg)) {
215
- mpq_get_struct (arg, arg_val_q);
127
+ mpq_get_struct(arg, arg_val_q);
216
128
  mpf_set_q(self_val, arg_val_q);
217
129
  } else if (GMPZ_P(arg)) {
218
- mpz_get_struct (arg, arg_val_z);
130
+ mpz_get_struct(arg, arg_val_z);
219
131
  mpf_set_z(self_val, arg_val_z);
220
132
  } else if (FLOAT_P(arg)) {
221
133
  mpf_set_d(self_val, FLT2DBL(arg));
@@ -223,7 +135,7 @@ static void mpf_set_value(MP_FLOAT *self_val, VALUE arg)
223
135
  mpf_set_si(self_val, FIX2INT(arg));
224
136
  } else if (STRING_P(arg)) {
225
137
  if (mpf_set_str(self_val, STR2CSTR(arg), 10) == -1) {
226
- rb_raise (rb_eRuntimeError, "Badly formatted string");
138
+ rb_raise(rb_eRuntimeError, "Badly formatted string");
227
139
  }
228
140
  } else if (BIGNUM_P(arg)) {
229
141
  #if 1 /* GMP3 code */
@@ -232,7 +144,7 @@ static void mpf_set_value(MP_FLOAT *self_val, VALUE arg)
232
144
  mpz_temp_free(arg_val_z);
233
145
  #endif
234
146
  } else {
235
- rb_raise (rb_eTypeError, "Don't know how to convert %s into GMP::F", rb_class2name(rb_class_of(arg)));
147
+ rb_raise(rb_eTypeError, "Don't know how to convert %s into GMP::F", rb_class2name(rb_class_of(arg)));
236
148
  }
237
149
  }
238
150
 
@@ -334,19 +246,13 @@ static VALUE r_gmpf_coerce(VALUE self, VALUE arg)
334
246
  return rb_assoc_new(r_gmpfsg_new(1, &arg, cGMP_F), self);
335
247
  }
336
248
 
337
- static VALUE r_gmpmod_z(int argc, VALUE *argv, VALUE module)
338
- {
339
- (void)module;
340
- return r_gmpzsg_new(argc, argv, cGMP_Z);
341
- }
342
-
343
- static VALUE r_gmpmod_q(int argc, VALUE *argv, VALUE module)
249
+ VALUE r_gmpmod_q(int argc, VALUE *argv, VALUE module)
344
250
  {
345
251
  (void)module;
346
252
  return r_gmpqsg_new(argc, argv, cGMP_Q);
347
253
  }
348
254
 
349
- static VALUE r_gmpmod_f(int argc, VALUE *argv, VALUE module)
255
+ VALUE r_gmpmod_f(int argc, VALUE *argv, VALUE module)
350
256
  {
351
257
  (void)module;
352
258
  return r_gmpfsg_new(argc, argv, cGMP_F);
@@ -374,7 +280,7 @@ static VALUE r_gmpfsg_set_default_prec(VALUE klass, VALUE arg)
374
280
 
375
281
  #include "gmpf.h"
376
282
  #include "gmpq.h"
377
- #include "gmpz.h"
283
+ /* #include "gmpz.h" */
378
284
  #include "takeover.h"
379
285
 
380
286
  #define REGISTER_TAKEOVER(fname, ruby_fname, old_fname) \
@@ -383,144 +289,39 @@ static VALUE r_gmpfsg_set_default_prec(VALUE klass, VALUE arg)
383
289
  rb_define_alias(rb_cBignum, old_fname, ruby_fname); \
384
290
  rb_define_method(rb_cBignum, ruby_fname, takeover_bignum_##fname, -1);
385
291
 
386
- void Init_gmp () {
292
+ void Init_gmp() {
387
293
  mGMP = rb_define_module("GMP");
388
294
  rb_define_module_function(mGMP, "Z", r_gmpmod_z, -1);
389
295
  rb_define_module_function(mGMP, "Q", r_gmpmod_q, -1);
390
296
  rb_define_module_function(mGMP, "F", r_gmpmod_f, -1);
391
297
 
392
298
  cGMP_Z = rb_define_class_under(mGMP, "Z", rb_cInteger);
299
+ init_gmpz();
393
300
  rb_define_singleton_method(cGMP_Z, "new", r_gmpzsg_new, -1);
394
- rb_define_singleton_method(cGMP_Z, "fib", r_gmpzsg_fib, 1);
395
- rb_define_singleton_method(cGMP_Z, "fac", r_gmpzsg_fac, 1);
396
301
  rb_define_singleton_method(cGMP_Z, "pow", r_gmpzsg_pow, 2);
397
302
  rb_define_method(cGMP_Z, "initialize", r_gmpz_initialize, -1);
398
303
  rb_define_method(cGMP_Z, "to_s", r_gmpz_to_s, 0);
399
304
  rb_define_method(cGMP_Z, "coerce", r_gmpz_coerce, 1);
400
- rb_define_method(cGMP_Z, "+", r_gmpz_add, 1);
401
- rb_define_method(cGMP_Z, "add!", r_gmpz_add_self, 1);
402
- rb_define_method(cGMP_Z, "-", r_gmpz_sub, 1);
403
- rb_define_method(cGMP_Z, "sub!", r_gmpz_sub_self, 1);
404
- rb_define_method(cGMP_Z, "*", r_gmpz_mul, 1);
405
- rb_define_method(cGMP_Z, "/", r_gmpz_div, 1);
406
- rb_define_method(cGMP_Z, "tdiv", r_gmpz_tdiv, 1);
407
- rb_define_method(cGMP_Z, "tmod", r_gmpz_tmod, 1);
408
- rb_define_method(cGMP_Z, "fdiv", r_gmpz_fdiv, 1);
409
- rb_define_method(cGMP_Z, "fmod", r_gmpz_fmod, 1);
410
- rb_define_method(cGMP_Z, "cdiv", r_gmpz_cdiv, 1);
411
- rb_define_method(cGMP_Z, "cmod", r_gmpz_cmod, 1);
412
- rb_define_method(cGMP_Z, "-@", r_gmpz_neg, 0);
413
- rb_define_method(cGMP_Z, "neg", r_gmpz_neg, 0);
414
- rb_define_method(cGMP_Z, "neg!", r_gmpz_neg_self, 0);
415
- rb_define_method(cGMP_Z, "abs", r_gmpz_abs, 0);
416
- rb_define_method(cGMP_Z, "abs!", r_gmpz_abs_self, 0);
417
- rb_define_method(cGMP_Z, "com", r_gmpz_com, 0);
418
- rb_define_method(cGMP_Z, "com!", r_gmpz_com_self, 0);
419
- rb_define_method(cGMP_Z, "&", r_gmpz_and, 1);
420
- rb_define_method(cGMP_Z, "|", r_gmpz_or, 1);
421
- rb_define_method(cGMP_Z, "^", r_gmpz_xor, 1);
422
- rb_define_method(cGMP_Z, "[]=", r_gmpz_setbit, 2);
423
- rb_define_method(cGMP_Z, "[]", r_gmpz_getbit, 1);
424
- rb_define_method(cGMP_Z, "scan0", r_gmpz_scan0, 1);
425
- rb_define_method(cGMP_Z, "scan1", r_gmpz_scan1, 1);
426
- rb_define_method(cGMP_Z, "**", r_gmpz_pow, 1);
427
- rb_define_method(cGMP_Z, "powmod", r_gmpz_powm, 2);
428
- rb_define_method(cGMP_Z, "even?", r_gmpz_is_even, 0);
429
- rb_define_method(cGMP_Z, "odd?", r_gmpz_is_odd, 0);
430
- rb_define_method(cGMP_Z, "sgn", r_gmpz_sgn, 0);
431
- rb_define_method(cGMP_Z, "<=>", r_gmpz_cmp, 1);
432
- rb_define_method(cGMP_Z, ">", r_gmpz_cmp_gt, 1);
433
- rb_define_method(cGMP_Z, ">=", r_gmpz_cmp_ge, 1);
434
- rb_define_method(cGMP_Z, "<", r_gmpz_cmp_lt, 1);
435
- rb_define_method(cGMP_Z, "<=", r_gmpz_cmp_le, 1);
436
- rb_define_method(cGMP_Z, "==", r_gmpz_eq, 1);
437
- rb_define_method(cGMP_Z, ">>", r_gmpz_fshr, 1);
438
- rb_define_method(cGMP_Z, "<<", r_gmpz_shl, 1);
439
- rb_define_method(cGMP_Z, "tshr", r_gmpz_tshr, 1);
440
- rb_define_method(cGMP_Z, "lastbits_sgn", r_gmpz_tshrm, 1);
441
- rb_define_method(cGMP_Z, "lastbits_pos", r_gmpz_fshrm, 1);
442
- rb_define_method(cGMP_Z, "square?", r_gmpz_is_square, 0);
443
- rb_define_method(cGMP_Z, "power?", r_gmpz_is_power, 0);
444
- rb_define_method(cGMP_Z, "swap", r_gmpz_swap, 1);
445
- rb_define_method(cGMP_Z, "sqrt", r_gmpz_sqrt, 0);
446
- rb_define_method(cGMP_Z, "sqrt!", r_gmpz_sqrt_self, 0);
447
- rb_define_method(cGMP_Z, "sqrtrem", r_gmpz_sqrtrem, 0);
448
- rb_define_method(cGMP_Z, "jacobi", r_gmpz_jacobi, 0);
449
- rb_define_method(cGMP_Z, "legendre", r_gmpz_legendre, 0);
450
- rb_define_method(cGMP_Z, "probab_prime?", r_gmpz_is_probab_prime, -1);
451
- rb_define_method(cGMP_Z, "nextprime", r_gmpz_nextprime, 0);
452
- rb_define_method(cGMP_Z, "nextprime!", r_gmpz_nextprime_self, 0);
453
- rb_define_method(cGMP_Z, "popcount", r_gmpz_popcount, 0);
454
- rb_define_method(cGMP_Z, "to_d", r_gmpz_to_d, 0);
455
- rb_define_method(cGMP_Z, "root", r_gmpz_root, 1);
456
- rb_define_method(cGMP_Z, "remove", r_gmpz_remove, 1);
457
- rb_define_method(cGMP_Z, "to_i", r_gmpz_to_i, 0);
458
- rb_define_method(cGMP_Z, "cmpabs", r_gmpz_cmpabs, 1);
459
305
  /*
460
306
  rb_define_method(cGMP_Z, "gcd", r_gmpz_gcd, 1);
461
307
  rb_define_method(cGMP_Z, "lcm", r_gmpz_lcm, 1);
462
308
  */
463
309
  cGMP_Q = rb_define_class_under (mGMP, "Q", rb_cNumeric);
310
+ init_gmpq();
464
311
  rb_define_singleton_method(cGMP_Q, "new", r_gmpqsg_new, -1);
465
312
  rb_define_method(cGMP_Q, "initialize", r_gmpq_initialize, -1);
466
313
  rb_define_method(cGMP_Q, "to_s", r_gmpq_to_s, 0);
467
314
  rb_define_method(cGMP_Q, "coerce", r_gmpq_coerce, 1);
468
315
  rb_define_method(cGMP_Q, "num", r_gmpq_num, 0);
469
316
  rb_define_method(cGMP_Q, "den", r_gmpq_den, 0);
470
- rb_define_method(cGMP_Q, "+", r_gmpq_add, 1);
471
- rb_define_method(cGMP_Q, "-", r_gmpq_sub, 1);
472
- rb_define_method(cGMP_Q, "*", r_gmpq_mul, 1);
473
- rb_define_method(cGMP_Q, "/", r_gmpq_div, 1);
474
- rb_define_method(cGMP_Q, "inv", r_gmpq_inv, 0);
475
- rb_define_method(cGMP_Q, "inv!", r_gmpq_inv_self, 0);
476
- rb_define_method(cGMP_Q, "-@", r_gmpq_neg, 0);
477
- rb_define_method(cGMP_Q, "neg!", r_gmpq_neg_self, 0);
478
- rb_define_method(cGMP_Q, "abs", r_gmpq_abs, 0);
479
- rb_define_method(cGMP_Q, "abs!", r_gmpq_abs_self, 0);
480
- rb_define_method(cGMP_Q, "sgn", r_gmpq_sgn, 0);
481
- rb_define_method(cGMP_Q, "<=>", r_gmpq_cmp, 1);
482
- rb_define_method(cGMP_Q, ">", r_gmpq_cmp_gt, 1);
483
- rb_define_method(cGMP_Q, ">=", r_gmpq_cmp_ge, 1);
484
- rb_define_method(cGMP_Q, "<", r_gmpq_cmp_lt, 1);
485
- rb_define_method(cGMP_Q, "<=", r_gmpq_cmp_le, 1);
486
- rb_define_method(cGMP_Q, "==", r_gmpq_eq, 1);
487
- rb_define_method(cGMP_Q, "swap", r_gmpq_swap, 1);
488
- rb_define_method(cGMP_Q, "floor", r_gmpq_floor, 0);
489
- rb_define_method(cGMP_Q, "ceil", r_gmpq_ceil, 0);
490
- rb_define_method(cGMP_Q, "trunc", r_gmpq_trunc, 0);
491
- rb_define_method(cGMP_Q, "to_d", r_gmpq_to_d, 0);
492
- rb_define_method(cGMP_Q, "cmpabs", r_gmpq_cmpabs, 1);
493
317
 
494
318
  cGMP_F = rb_define_class_under (mGMP, "F", rb_cNumeric);
319
+ init_gmpf();
495
320
  rb_define_singleton_method(cGMP_F, "new", r_gmpfsg_new, -1);
496
321
  rb_define_singleton_method(cGMP_F, "default_prec", r_gmpfsg_get_default_prec, 0);
497
322
  rb_define_singleton_method(cGMP_F, "default_prec=", r_gmpfsg_set_default_prec, 1);
498
323
  rb_define_method(cGMP_F, "initialize", r_gmpf_initialize, -1);
499
- rb_define_method(cGMP_F, "to_s", r_gmpf_to_s, 0);
500
324
  rb_define_method(cGMP_F, "coerce", r_gmpf_coerce, 1); // new method - testing
501
- rb_define_method(cGMP_F, "+", r_gmpf_add, 1);
502
- rb_define_method(cGMP_F, "-", r_gmpf_sub, 1);
503
- rb_define_method(cGMP_F, "*", r_gmpf_mul, 1);
504
- rb_define_method(cGMP_F, "/", r_gmpf_div, 1);
505
- rb_define_method(cGMP_F, "-@", r_gmpf_neg, 0);
506
- rb_define_method(cGMP_F, "neg!", r_gmpf_neg_self, 0);
507
- rb_define_method(cGMP_F, "abs", r_gmpf_abs, 0);
508
- rb_define_method(cGMP_F, "abs!", r_gmpf_abs_self, 0);
509
- rb_define_method(cGMP_F, "sgn", r_gmpf_sgn, 0);
510
- rb_define_method(cGMP_F, "<=>", r_gmpf_cmp, 1);
511
- rb_define_method(cGMP_F, ">", r_gmpf_cmp_gt, 1);
512
- rb_define_method(cGMP_F, ">=", r_gmpf_cmp_ge, 1);
513
- rb_define_method(cGMP_F, "<", r_gmpf_cmp_lt, 1);
514
- rb_define_method(cGMP_F, "<=", r_gmpf_cmp_le, 1);
515
- rb_define_method(cGMP_F, "==", r_gmpf_eq, 1);
516
- rb_define_method(cGMP_F, "floor", r_gmpf_floor, 0);
517
- rb_define_method(cGMP_F, "floor!", r_gmpf_floor_self, 0);
518
- rb_define_method(cGMP_F, "ceil", r_gmpf_ceil, 0);
519
- rb_define_method(cGMP_F, "ceil!", r_gmpf_ceil_self, 0);
520
- rb_define_method(cGMP_F, "trunc", r_gmpf_trunc, 0);
521
- rb_define_method(cGMP_F, "trunc!", r_gmpf_trunc_self, 0);
522
- rb_define_method(cGMP_F, "to_d", r_gmpf_to_d, 0);
523
- rb_define_method(cGMP_F, "prec", r_gmpf_get_prec, 0);
524
325
 
525
326
  /* rb_define_method(cGMP_F, "cmpabs", r_gmpf_cmpabs, 1);*/
526
327