srawlins-gmp 0.1.4.2 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
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