gmp 0.6.47 → 0.7.19

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 (58) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG +21 -1
  3. data/README.markdown +29 -9
  4. data/ext/extconf.rb +8 -0
  5. data/ext/gmp.c +7 -7
  6. data/ext/gmpf.c +620 -139
  7. data/ext/gmpq.c +218 -90
  8. data/ext/gmprandstate.c +57 -53
  9. data/ext/gmpz.c +492 -440
  10. data/ext/mprnd.c +44 -35
  11. data/ext/ruby_gmp.h +6 -6
  12. data/manual.pdf +0 -0
  13. data/manual.tex +2 -2
  14. data/test/mpfr_thypot.rb +60 -0
  15. data/test/tc_cmp.rb +1 -1
  16. data/test/tc_constants.rb +1 -1
  17. data/test/tc_division.rb +1 -1
  18. data/test/tc_f_abs_neg.rb +1 -1
  19. data/test/tc_f_arithmetics_coersion.rb +1 -1
  20. data/test/tc_f_precision.rb +2 -1
  21. data/test/tc_f_to_s.rb +1 -1
  22. data/test/tc_hashes.rb +1 -4
  23. data/test/tc_mpfr_cmp.rb +1 -1
  24. data/test/tc_mpfr_constants.rb +1 -1
  25. data/test/tc_mpfr_functions.rb +43 -10
  26. data/test/tc_mpfr_inf_nan_zero.rb +1 -1
  27. data/test/tc_mpfr_integer.rb +1 -1
  28. data/test/tc_mpfr_new_rounding.rb +24 -1
  29. data/test/tc_mpfr_pow.rb +17 -0
  30. data/test/tc_mpfr_random.rb +1 -1
  31. data/test/tc_mpfr_rounding.rb +1 -1
  32. data/test/tc_q.rb +53 -32
  33. data/test/tc_q_basic.rb +1 -1
  34. data/test/{tc_floor_ceil_truncate.rb → tc_q_floor_ceil_truncate.rb} +2 -2
  35. data/test/tc_q_num_den.rb +18 -0
  36. data/test/tc_random.rb +1 -4
  37. data/test/tc_sgn_neg_abs.rb +1 -1
  38. data/test/tc_swap.rb +1 -1
  39. data/test/tc_z.rb +1 -1
  40. data/test/tc_z_addmul.rb +1 -1
  41. data/test/tc_z_basic.rb +3 -2
  42. data/test/tc_z_exponentiation.rb +5 -5
  43. data/test/tc_z_export_import.rb +1 -1
  44. data/test/{tc_fib_fac_nextprime.rb → tc_z_fib_fac_nextprime.rb} +1 -1
  45. data/test/tc_z_functional_mappings.rb +2 -2
  46. data/test/tc_z_gcd_lcm_invert.rb +1 -1
  47. data/test/tc_z_hamdist.rb +1 -1
  48. data/test/tc_z_io.rb +2 -1
  49. data/test/tc_z_jac_leg_rem.rb +1 -1
  50. data/test/tc_z_logic.rb +1 -1
  51. data/test/{tc_logical_roots.rb → tc_z_logical_roots.rb} +7 -7
  52. data/test/tc_z_shifts_last_bits.rb +2 -2
  53. data/test/tc_z_submul.rb +1 -1
  54. data/test/tc_z_to_dis.rb +1 -1
  55. data/test/{tc_zerodivisionexceptions.rb → tc_zero_division_exceptions.rb} +2 -2
  56. data/test/unit_tests.rb +30 -17
  57. metadata +16 -16
  58. data/INSTALL +0 -4
@@ -11,8 +11,8 @@ VALUE r_mprndsg_new(int argc, VALUE *argv, VALUE klass)
11
11
  (void)klass;
12
12
  res_value = 0;
13
13
 
14
- mprnd_make_struct(res, res_value);
15
- rb_obj_call_init(res, argc, argv);
14
+ mprnd_make_struct (res, res_value);
15
+ rb_obj_call_init (res, argc, argv);
16
16
  return res;
17
17
  }
18
18
 
@@ -27,68 +27,77 @@ VALUE r_mprnd_initialize(int argc, VALUE *argv, VALUE self)
27
27
  prefix = "GMP";
28
28
  else
29
29
  prefix = "MPFR";
30
- switch (FIX2INT(mode)) {
30
+ switch (FIX2INT (mode)) {
31
31
  case 0:
32
- sprintf(name_val, "%s_RNDN", prefix);
33
- ieee754 = rb_str_new2("roundTiesToEven");
32
+ sprintf (name_val, "%s_RNDN", prefix);
33
+ ieee754 = rb_str_new2 ("roundTiesToEven");
34
34
  break;
35
35
  case 1:
36
- sprintf(name_val, "%s_RNDZ", prefix);
37
- ieee754 = rb_str_new2("roundTowardZero");
36
+ sprintf (name_val, "%s_RNDZ", prefix);
37
+ ieee754 = rb_str_new2 ("roundTowardZero");
38
38
  break;
39
39
  case 2:
40
- sprintf(name_val, "%s_RNDU", prefix);
41
- ieee754 = rb_str_new2("roundTowardPositive");
40
+ sprintf (name_val, "%s_RNDU", prefix);
41
+ ieee754 = rb_str_new2 ("roundTowardPositive");
42
42
  break;
43
43
  case 3:
44
- sprintf(name_val, "%s_RNDD", prefix);
45
- ieee754 = rb_str_new2("roundTowardNegative");
44
+ sprintf (name_val, "%s_RNDD", prefix);
45
+ ieee754 = rb_str_new2 ("roundTowardNegative");
46
46
  break;
47
47
  case 4:
48
- sprintf(name_val, "%s_RNDA", prefix);
49
- ieee754 = rb_str_new2("roundAwayFromZero");
48
+ sprintf (name_val, "%s_RNDA", prefix);
49
+ ieee754 = rb_str_new2 ("roundAwayFromZero");
50
50
  break;
51
51
  default:
52
- sprintf(name_val, "%s_RNDN", prefix);
53
- ieee754 = rb_str_new2("roundTiesToEven");
52
+ sprintf (name_val, "%s_RNDN", prefix);
53
+ ieee754 = rb_str_new2 ("roundTiesToEven");
54
54
  }
55
- name = rb_str_new2(name_val);
56
- rb_iv_set(self, "@mode", mode);
57
- rb_iv_set(self, "@name", name);
58
- rb_iv_set(self, "@ieee754", ieee754);
55
+ name = rb_str_new2 (name_val);
56
+ rb_iv_set (self, "@mode", mode);
57
+ rb_iv_set (self, "@name", name);
58
+ rb_iv_set (self, "@ieee754", ieee754);
59
59
  return Qnil;
60
60
  }
61
61
 
62
62
  VALUE r_mprnd_inspect(VALUE self)
63
63
  {
64
- return rb_iv_get(self, "@name");
64
+ return rb_iv_get (self, "@name");
65
65
  }
66
66
 
67
67
  void init_gmprnd()
68
68
  {
69
- ID new_id = rb_intern("new");
70
- mGMP = rb_define_module("GMP");
69
+ ID new_id = rb_intern ("new");
70
+ mGMP = rb_define_module ("GMP");
71
71
 
72
- cGMP_Rnd = rb_define_class_under(mGMP, "Rnd", rb_cObject);
72
+ cGMP_Rnd = rb_define_class_under (mGMP, "Rnd", rb_cObject);
73
73
 
74
- rb_define_singleton_method(cGMP_Rnd, "new", r_mprndsg_new, -1);
75
- rb_define_method(cGMP_Rnd, "initialize", r_mprnd_initialize, -1);
76
- rb_define_method(cGMP_Rnd, "inspect", r_mprnd_inspect, 0);
74
+ rb_define_singleton_method (cGMP_Rnd, "new", r_mprndsg_new, -1);
75
+ rb_define_method (cGMP_Rnd, "initialize", r_mprnd_initialize, -1);
76
+ rb_define_method (cGMP_Rnd, "inspect", r_mprnd_inspect, 0);
77
77
 
78
78
  rb_define_attr (cGMP_Rnd, "mode", 1, 0);
79
79
  rb_define_attr (cGMP_Rnd, "name", 1, 0);
80
80
  rb_define_attr (cGMP_Rnd, "ieee754", 1, 0);
81
81
 
82
- rb_define_const(mGMP, "GMP_RNDN", rb_funcall (cGMP_Rnd, new_id, 1, INT2FIX(0)));
83
- rb_define_const(mGMP, "GMP_RNDZ", rb_funcall (cGMP_Rnd, new_id, 1, INT2FIX(1)));
84
- rb_define_const(mGMP, "GMP_RNDU", rb_funcall (cGMP_Rnd, new_id, 1, INT2FIX(2)));
85
- rb_define_const(mGMP, "GMP_RNDD", rb_funcall (cGMP_Rnd, new_id, 1, INT2FIX(3)));
82
+ /* GMP_RNDN: MPFR rounding mode roundTiesToEven for MPFR < 3.0 */
83
+ rb_define_const (mGMP, "GMP_RNDN", rb_funcall (cGMP_Rnd, new_id, 1, INT2FIX (0)));
84
+ /* GMP_RNDZ: MPFR rounding mode roundTowardZero for MPFR < 3.0 */
85
+ rb_define_const (mGMP, "GMP_RNDZ", rb_funcall (cGMP_Rnd, new_id, 1, INT2FIX (1)));
86
+ /* GMP_RNDU: MPFR rounding mode roundTowardPositive for MPFR < 3.0 */
87
+ rb_define_const (mGMP, "GMP_RNDU", rb_funcall (cGMP_Rnd, new_id, 1, INT2FIX (2)));
88
+ /* GMP_RNDD: MPFR rounding mode roundTowardNegative for MPFR < 3.0 */
89
+ rb_define_const (mGMP, "GMP_RNDD", rb_funcall (cGMP_Rnd, new_id, 1, INT2FIX (3)));
86
90
  /* MPFR 3.0.0 */
87
- rb_define_const(mGMP, "MPFR_RNDN", rb_funcall (cGMP_Rnd, new_id, 1, INT2FIX(0)));
88
- rb_define_const(mGMP, "MPFR_RNDZ", rb_funcall (cGMP_Rnd, new_id, 1, INT2FIX(1)));
89
- rb_define_const(mGMP, "MPFR_RNDU", rb_funcall (cGMP_Rnd, new_id, 1, INT2FIX(2)));
90
- rb_define_const(mGMP, "MPFR_RNDD", rb_funcall (cGMP_Rnd, new_id, 1, INT2FIX(3)));
91
- rb_define_const(mGMP, "MPFR_RNDA", rb_funcall (cGMP_Rnd, new_id, 1, INT2FIX(4)));
91
+ /* MPFR_RNDN: MPFR rounding mode roundTiesToEven */
92
+ rb_define_const (mGMP, "MPFR_RNDN", rb_funcall (cGMP_Rnd, new_id, 1, INT2FIX (0)));
93
+ /* MPFR_RNDZ: MPFR rounding mode roundTowardZero */
94
+ rb_define_const (mGMP, "MPFR_RNDZ", rb_funcall (cGMP_Rnd, new_id, 1, INT2FIX (1)));
95
+ /* MPFR_RNDU: MPFR rounding mode roundTowardPositive */
96
+ rb_define_const (mGMP, "MPFR_RNDU", rb_funcall (cGMP_Rnd, new_id, 1, INT2FIX (2)));
97
+ /* MPFR_RNDU: MPFR rounding mode roundTowardNegative */
98
+ rb_define_const (mGMP, "MPFR_RNDD", rb_funcall (cGMP_Rnd, new_id, 1, INT2FIX (3)));
99
+ /* MPFR_RNDA: MPFR rounding mode roundAwayFromZero */
100
+ rb_define_const (mGMP, "MPFR_RNDA", rb_funcall (cGMP_Rnd, new_id, 1, INT2FIX (4)));
92
101
  /* end MPFR 3.0.0 */
93
102
  }
94
103
 
@@ -94,12 +94,12 @@ typedef __gmp_randstate_struct MP_RANDSTATE;
94
94
 
95
95
  #if defined(MPFR) && defined(HAVE_MPFR_H)
96
96
  #define mpf_get_struct_prec(ruby_var,c_var,prec) { \
97
- mpf_get_struct (ruby_var,c_var); \
97
+ mpf_get_struct (ruby_var, c_var); \
98
98
  prec = mpfr_get_prec (c_var); \
99
99
  }
100
100
  #define mpf_make_struct_init(ruby_var,c_var,prec) { \
101
- mpf_make_struct (ruby_var,c_var); \
102
- mpfr_init2 (c_var,prec); \
101
+ mpf_make_struct (ruby_var, c_var); \
102
+ mpfr_init2 (c_var, prec); \
103
103
  }
104
104
  #define mpf_temp_init(var,prec) { mpf_temp_alloc(var); mpfr_init2(var,prec); }
105
105
  #define mpf_temp_free(var) { mpfr_clear(var); free(var); }
@@ -264,8 +264,8 @@ extern int mpq_cmp_value(MP_RAT *OP, VALUE arg);
264
264
  extern VALUE r_gmpq_sgn(VALUE self);
265
265
 
266
266
  // Applying Integer Functions
267
- extern VALUE r_gmpq_num(VALUE self);
268
- extern VALUE r_gmpq_den(VALUE self);
267
+ extern VALUE r_gmpq_get_num(VALUE self);
268
+ extern VALUE r_gmpq_get_den(VALUE self);
269
269
 
270
270
  // _unsorted_
271
271
 
@@ -307,7 +307,7 @@ extern int mpf_cmp_value(MP_FLOAT *OP, VALUE arg);
307
307
 
308
308
  // MPFR
309
309
  #ifdef MPFR
310
- extern void mpf_set_value2(MP_FLOAT *self_val, VALUE arg, int base);
310
+ extern void mpf_set_value2(MP_FLOAT *self_val, VALUE arg, int base, mp_rnd_t rnd_mode_val);
311
311
 
312
312
  extern VALUE r_gmpfr_sqrt(int argc, VALUE *argv, VALUE self);
313
313
  extern VALUE r_gmpfr_rec_sqrt(int argc, VALUE *argv, VALUE self);
data/manual.pdf CHANGED
Binary file
data/manual.tex CHANGED
@@ -34,8 +34,8 @@
34
34
  \huge{gmp} &\\
35
35
  \midrule[3pt]
36
36
  \multicolumn{2}{r}{\large{Ruby bindings to the GMP library}}\\
37
- \multicolumn{2}{r}{\large{Edition 0.6.47}}\\
38
- \multicolumn{2}{r}{\large{31 December 2013}}
37
+ \multicolumn{2}{r}{\large{Edition 0.7.19}}\\
38
+ \multicolumn{2}{r}{\large{12 March 2014}}
39
39
  \end{tabular}
40
40
 
41
41
  \vfill
@@ -0,0 +1,60 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), 'test_helper'))
2
+
3
+ class MpfrTHypot < Test::Unit::TestCase
4
+ def test_special
5
+ x = GMP::F.nan
6
+ y = GMP::F.new
7
+ assert_equal(GMP::F.nan, x.hypot(y), "NaN.hypot(...) is NaN")
8
+
9
+ x = GMP::F.inf
10
+ y = GMP::F.inf(-1)
11
+ assert_equal(GMP::F.inf, x.hypot(y), "Inf.hypot(-Inf) is Inf")
12
+
13
+ x = GMP::F.nan
14
+ y = GMP::F.inf(-1)
15
+ assert_equal(GMP::F.inf, x.hypot(y), "NaN.hypot(-Inf) is Inf")
16
+ end
17
+
18
+ def test_large
19
+ x = GMP::F(21)
20
+ y = GMP::F(28)
21
+ z = GMP::F(35)
22
+
23
+ # TODO: need mpfr_mul_2ui!!!
24
+ end
25
+
26
+ def small_tests
27
+ x = GMP::F.new_2exp(1, GMP::F.emin-1, 8)
28
+ y = GMP::F.new_2exp(1, GMP::F.emin-1, 8)
29
+ z1 = GMP::F.new(2, 8)
30
+ z1 = z1.sqrt * x
31
+ z2 = x.hypot(y)
32
+
33
+ assert_equal(z1, z2, "x.hypot(y) should == sqrt(2) * x")
34
+ end
35
+
36
+ def large_small_tests
37
+ x = GMP::F.new_2exp(1, GMP::F.emax/2, 3)
38
+ y = GMP::F.new_2exp(1, -1, 2)
39
+ z = x.hypot(y)
40
+
41
+ assert_equal(x, z, "hypot... something abount large_small")
42
+ end
43
+
44
+ def test_hypot
45
+ small_tests
46
+ large_small_tests
47
+
48
+ emin = GMP::F.emin
49
+ emax = GMP::F.emax
50
+ GMP::F.emin = GMP::F.emin_min
51
+ GMP::F.emax = GMP::F.emax_max
52
+
53
+ if GMP::F.emin != emin || GMP::F.emax != emax
54
+ small_tests
55
+ large_small_tests
56
+ GMP::F.emin = emin
57
+ GMP::F.emax = emax
58
+ end
59
+ end
60
+ end
@@ -1,6 +1,6 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), 'test_helper'))
2
2
 
3
- class TC_Cmp < Test::Unit::TestCase
3
+ class TcCmp < Test::Unit::TestCase
4
4
  def setup
5
5
  @_64bit = 1_000_000_000_000.is_a? Fixnum
6
6
  @a=GMP::Z.new(180)
@@ -1,6 +1,6 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), 'test_helper'))
2
2
 
3
- class TC_Constants < Test::Unit::TestCase
3
+ class TcConstants < Test::Unit::TestCase
4
4
  def test_constants
5
5
  assert_instance_of(String, GMP::GMP_VERSION, "GMP::GMP_VERSION should be a String")
6
6
  assert_instance_of(String, GMP::GMP_CC, "GMP::GMP_CC should be a String")
@@ -1,6 +1,6 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), 'test_helper'))
2
2
 
3
- class TC_division < Test::Unit::TestCase
3
+ class TcDivision < Test::Unit::TestCase
4
4
  def setup
5
5
  @a = GMP::Z.new(5)
6
6
  @b = GMP::Z.new(7)
@@ -1,6 +1,6 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), 'test_helper'))
2
2
 
3
- class TC_f_abs_neg < Test::Unit::TestCase
3
+ class TcFloatAbsNeg < Test::Unit::TestCase
4
4
  def setup
5
5
  @a=GMP::F.new(3.14)
6
6
  @b=GMP::F.new()
@@ -1,6 +1,6 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), 'test_helper'))
2
2
 
3
- class TC_F_arithmetics_coersion < Test::Unit::TestCase
3
+ class TcFloatArithmeticsCoersion < Test::Unit::TestCase
4
4
  def setup
5
5
  @a = GMP::F.new(3.14, 100)
6
6
  @b = GMP::F.new(2.71, 200)
@@ -1,7 +1,8 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), 'test_helper'))
2
2
 
3
- class TC_precision < Test::Unit::TestCase
3
+ class TcFloatPrecision < Test::Unit::TestCase
4
4
  def setup
5
+ # TODO: um... what?
5
6
  begin
6
7
  GMP::MPFR_VERSION
7
8
  @initial_default_prec = GMP::F.default_prec
@@ -1,6 +1,6 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), 'test_helper'))
2
2
 
3
- class TC_F_to_s < Test::Unit::TestCase
3
+ class TcFloatToS < Test::Unit::TestCase
4
4
  def setup
5
5
  @initial_default_prec = GMP::F.default_prec
6
6
  end
@@ -1,9 +1,6 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), 'test_helper'))
2
2
 
3
- class TC_Hashes < Test::Unit::TestCase
4
- def setup
5
- end
6
-
3
+ class TcHashes < Test::Unit::TestCase
7
4
  def test_z_hashes
8
5
  h = {}
9
6
  h[GMP::Z(131)] = [GMP::Z(41), GMP::Z(43), GMP::Z(47)]
@@ -1,6 +1,6 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), 'test_helper'))
2
2
 
3
- class TC_MPFR_Cmp < Test::Unit::TestCase
3
+ class TcMpfrCmp < Test::Unit::TestCase
4
4
  def setup
5
5
  @neg_inf = GMP::F(0).log # -Inf
6
6
  @inf = -@neg_inf # Inf
@@ -1,6 +1,6 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), 'test_helper'))
2
2
 
3
- class TC_MPFR_Constants < Test::Unit::TestCase
3
+ class TcMpfrConstants < Test::Unit::TestCase
4
4
  def test_mpfr_constants
5
5
  assert_instance_of(String, GMP::MPFR_VERSION, "GMP::MPFR_VERSION should be a String")
6
6
  assert_instance_of(Fixnum, GMP::MPFR_PREC_MIN, "GMP::MPFR_PREC_MIN should be a Fixnum")
@@ -1,11 +1,11 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), 'test_helper'))
2
2
 
3
- class TC_MPFR_Functions < Test::Unit::TestCase
3
+ class TcMpfrFunctions < Test::Unit::TestCase
4
4
  def setup
5
5
  @a = GMP::F(1)
6
6
  @b = GMP::F(2)
7
7
  end
8
-
8
+
9
9
  def test_const_existence
10
10
  constants = ["const_log2", "const_pi", "const_euler", "const_catalan"]
11
11
 
@@ -30,7 +30,7 @@ class TC_MPFR_Functions < Test::Unit::TestCase
30
30
  }
31
31
  end
32
32
  end
33
-
33
+
34
34
  def test_function_existence
35
35
  assert_nothing_raised("GMP::F.nan? should be callable.") { @a.nan? }
36
36
  assert_nothing_raised("GMP::F.infinite? should be callable.") { @a.infinite? }
@@ -43,7 +43,7 @@ class TC_MPFR_Functions < Test::Unit::TestCase
43
43
  assert_nothing_raised("GMP::F.sqrt should be callable.") { @a.sqrt }
44
44
  assert_nothing_raised("GMP::F.rec_sqrt should be callable.") { @a.rec_sqrt }
45
45
  assert_nothing_raised("GMP::F.cbrt should be callable.") { @a.cbrt }
46
-
46
+
47
47
  assert_nothing_raised("GMP::F.log should be callable.") { @a.log }
48
48
  assert_nothing_raised("GMP::F.log2 should be callable.") { @a.log2 }
49
49
  assert_nothing_raised("GMP::F.log10 should be callable.") { @a.log10 }
@@ -61,7 +61,8 @@ class TC_MPFR_Functions < Test::Unit::TestCase
61
61
  assert_nothing_raised("GMP::F.asin should be callable.") { @a.asin }
62
62
  assert_nothing_raised("GMP::F.atan should be callable.") { @a.atan }
63
63
  assert_nothing_raised("GMP::F.atan2 should be callable.") { @a.atan2(@b) }
64
-
64
+ assert_nothing_raised("GMP::F.atan2 should be callable with float arg") { @a.atan2(2.0) }
65
+
65
66
  assert_nothing_raised("GMP::F.cosh should be callable.") { @a.cosh }
66
67
  assert_nothing_raised("GMP::F.sinh should be callable.") { @a.sinh }
67
68
  assert_nothing_raised("GMP::F.tanh should be callable.") { @a.tanh }
@@ -72,14 +73,14 @@ class TC_MPFR_Functions < Test::Unit::TestCase
72
73
  assert_nothing_raised("GMP::F.acosh should be callable.") { @a.acosh }
73
74
  assert_nothing_raised("GMP::F.asinh should be callable.") { @a.asinh }
74
75
  assert_nothing_raised("GMP::F.atanh should be callable.") { @a.atanh }
75
-
76
+
76
77
  assert_nothing_raised("GMP::F.log1p should be callable.") { @a.log1p }
77
78
  assert_nothing_raised("GMP::F.expm1 should be callable.") { @a.expm1 }
78
79
  assert_nothing_raised("GMP::F.eint should be callable.") { @a.eint }
79
80
  assert_nothing_raised("GMP::F.li2 should be callable.") { @a.li2 }
80
81
  assert_nothing_raised("GMP::F.gamma should be callable.") { @a.gamma }
81
82
  assert_nothing_raised("GMP::F.lngamma should be callable.") { @a.lngamma }
82
- #assert_nothing_raised("GMP::F.lgamma should be callable.") { @a.lgamma }
83
+ # TODO: assert_nothing_raised("GMP::F.lgamma should be callable.") { @a.lgamma }
83
84
  if GMP::MPFR_VERSION >= "3.0.0"
84
85
  assert_nothing_raised("GMP::F.digamma should be callable.") { @a.digamma }
85
86
  end
@@ -98,11 +99,40 @@ class TC_MPFR_Functions < Test::Unit::TestCase
98
99
  assert_nothing_raised("GMP::F.yn should be callable.") { @a.yn(0) }
99
100
  assert_nothing_raised("GMP::F.yn should be callable.") { @a.yn(1) }
100
101
  assert_nothing_raised("GMP::F.yn should be callable.") { @a.yn(2) }
101
-
102
+
102
103
  assert_nothing_raised("GMP::F.agm should be callable.") { @a.agm(@b) }
103
104
  assert_nothing_raised("GMP::F.hypot should be callable.") { @a.hypot(@b) }
104
105
  end
105
-
106
+
107
+ def test_atan2
108
+ assert_in_delta @a.atan2(@b), Math.atan2(@a.to_f, @b.to_f), 0.0001
109
+ assert_in_delta (-@a).atan2((-@b)), Math.atan2((-@a).to_f, (-@b).to_f), 0.0001
110
+ assert_in_delta @a.atan2(3.0), Math.atan2(@a.to_f, 3.0), 0.0001
111
+ end
112
+
113
+ def test_class_methods
114
+ assert_true(GMP::F.emin.is_a?(Integer), "GMP::F.emin is callable")
115
+ assert_true(GMP::F.emax.is_a?(Integer), "GMP::F.emax is callable")
116
+ assert_true(GMP::F.emin_min.is_a?(Integer), "GMP::F.emin_min is callable")
117
+ assert_true(GMP::F.emin_max.is_a?(Integer), "GMP::F.emin_max is callable")
118
+ assert_true(GMP::F.emax_min.is_a?(Integer), "GMP::F.emax_min is callable")
119
+ assert_true(GMP::F.emax_max.is_a?(Integer), "GMP::F.emax_max is callable")
120
+ end
121
+
122
+ def test_emin
123
+ emin = GMP::F.emin
124
+ assert_nothing_raised("GMP::F.emin= works with good exp") { GMP::F.emin = emin/2 }
125
+ assert_equal(emin/2, GMP::F.emin, "GMP::F.emin= sets emin")
126
+ assert_raise(TypeError) { GMP::F.emin = :not_a_number }
127
+ end
128
+
129
+ def test_emax
130
+ emax = GMP::F.emax
131
+ assert_nothing_raised("GMP::F.emax= works with good exp") { GMP::F.emax = emax/2 }
132
+ assert_equal(emax/2, GMP::F.emax, "GMP::F.emax= sets emax")
133
+ assert_raise(TypeError) { GMP::F.emax = :not_a_number }
134
+ end
135
+
106
136
  def test_function_parameters
107
137
  single_functions = [:sqrt, :rec_sqrt, :cbrt,
108
138
  :log, :log2, :log10, :exp, :exp2, :exp10,
@@ -117,14 +147,17 @@ class TC_MPFR_Functions < Test::Unit::TestCase
117
147
  single_functions += [:digamma] if GMP::MPFR_VERSION >= "3.0.0"
118
148
  double_functions = [:sin_cos, :sinh_cosh]
119
149
  single_mpf_functions = [:atan2, :agm, :hypot]
120
-
150
+
121
151
  (single_functions + double_functions).each do |f|
122
152
  assert_nothing_raised("GMP::F.#{f} can be called w/ 1 arg: rounding_mode.") { @a.send(f, GMP::GMP_RNDN) }
123
153
  assert_nothing_raised("GMP::F.#{f} can be called w/ 1 arg: rounding_mode.") { @a.send(f, GMP::GMP_RNDZ) }
124
154
  assert_nothing_raised("GMP::F.#{f} can be called w/ 2 args: rounding_mode, prec.") { @a.send(f, GMP::GMP_RNDN, 32) }
125
155
  assert_nothing_raised("GMP::F.#{f} can be called w/ 2 args: rounding_mode, prec.") { @a.send(f, GMP::GMP_RNDN, 128) }
126
156
  assert_nothing_raised("GMP::F.#{f} can be called w/ 2 args: rounding_mode, prec.") { @a.send(f, GMP::GMP_RNDN, 200) }
157
+
158
+ assert_raise(TypeError) { @a.send(f, GMP::GMP_RNDN, "not a Fixnum") }
127
159
  end
160
+
128
161
  double_functions.each do |f|
129
162
  assert_nothing_raised("GMP::F.#{f} can be called w/ 3 args: rounding_mode, prec, prec.") { @a.send(f, GMP::GMP_RNDN, 64, 64) }
130
163
  assert_nothing_raised("GMP::F.#{f} can be called w/ 3 args: rounding_mode, prec, prec.") { @a.send(f, GMP::GMP_RNDN, 128, 64) }
@@ -1,6 +1,6 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), 'test_helper'))
2
2
 
3
- class TC_MPFR_Inf_Nan_Zero < Test::Unit::TestCase
3
+ class TcMpfrInfNanZero < Test::Unit::TestCase
4
4
  def setup
5
5
  @neg_inf = GMP::F(0).log # -Inf
6
6
  @inf = -@neg_inf # Inf