ruby-mpfr 0.0.2 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. data/History.txt +5 -2
  2. data/Manifest.txt +33 -7
  3. data/README.rdoc +10 -8
  4. data/Rakefile +4 -3
  5. data/ext/{extconf.rb → mpfr/extconf.rb} +4 -0
  6. data/ext/{ruby_mpfr.c → mpfr/ruby_mpfr.c} +466 -199
  7. data/ext/{ruby_mpfr.h → mpfr/ruby_mpfr.h} +2 -0
  8. data/ext/mpfr_matrix/mpfr/extconf.rb +7 -0
  9. data/ext/mpfr_matrix/mpfr/func_mpfr_matrix.c +524 -0
  10. data/ext/mpfr_matrix/mpfr/func_mpfr_matrix.h +72 -0
  11. data/ext/mpfr_matrix/mpfr/ruby_mpfr.h +40 -0
  12. data/ext/mpfr_matrix/mpfr/ruby_mpfr_matrix.c +1056 -0
  13. data/ext/mpfr_matrix/mpfr/ruby_mpfr_matrix.h +13 -0
  14. data/lib/mpfr/matrix.rb +145 -0
  15. data/lib/mpfr/version.rb +3 -0
  16. data/ruby-mpfr.gemspec +36 -0
  17. data/spec/mpfr/allocate_spec.rb +60 -0
  18. data/spec/mpfr/arithmetic_spec.rb +64 -0
  19. data/spec/mpfr/comparison_spec.rb +21 -0
  20. data/spec/mpfr/constant_spec.rb +23 -0
  21. data/spec/mpfr/conversion_spec.rb +14 -0
  22. data/spec/mpfr/exception_spec.rb +60 -0
  23. data/spec/mpfr/functions_spec.rb +25 -0
  24. data/spec/mpfr/generate_number_modulue.rb +44 -0
  25. data/spec/mpfr/precision_roundmode_spec.rb +65 -0
  26. data/spec/mpfr/rounding_spec.rb +51 -0
  27. data/spec/mpfr/set_value_spec.rb +77 -0
  28. data/spec/mpfr/spec_helper.rb +13 -0
  29. data/spec/mpfr/string_spec.rb +58 -0
  30. data/spec/mpfr_matrix/generate_matrix_arguments.rb +55 -0
  31. data/spec/mpfr_matrix/mpfr_matrix_alloc_spec.rb +126 -0
  32. data/spec/mpfr_matrix/mpfr_matrix_arithmetic_spec.rb +93 -0
  33. data/spec/mpfr_matrix/mpfr_matrix_set_element_spec.rb +55 -0
  34. data/spec/mpfr_matrix/mpfr_matrix_string_spec.rb +31 -0
  35. data/spec/mpfr_matrix/mpfr_square_matrix_spec.rb +75 -0
  36. data/spec/mpfr_matrix/spec_helper.rb +16 -0
  37. data/tasks/extconf.rake +36 -0
  38. metadata +48 -16
  39. data/lib/ruby-mpfr.rb +0 -6
  40. data/spec/ruby-mpfr_spec.rb +0 -11
  41. data/spec/spec_helper.rb +0 -10
  42. data/tasks/rspec.rake +0 -21
@@ -0,0 +1,13 @@
1
+ #ifndef RUBY_GMP_MATRIX
2
+ #define RUBY_GMP_MATRIX
3
+
4
+ #include "func_mpfr_matrix.h"
5
+
6
+ VALUE r_mpfr_matrix, r_mpfr_square_matrix, r_mpfr_col_vector, r_mpfr_row_vector, r_mpfr_vector_module;
7
+
8
+ void r_mpfr_matrix_free(void *ptr);
9
+
10
+ void r_mpfr_matrix_suitable_matrix_init (VALUE *other, MPFRMatrix **ptr_other, int row, int column);
11
+ VALUE r_mpfr_matrix_robj(MPFRMatrix *x);
12
+
13
+ #endif
@@ -0,0 +1,145 @@
1
+ require 'mpfr/matrix.so'
2
+
3
+ class MPFR
4
+ class Matrix
5
+ def str_ary2_2(format)
6
+ ary = str_ary(format)
7
+ tmp = []
8
+ (0...row_size).each { tmp << [] }
9
+ i = 0
10
+ while i < size
11
+ for j in 0...row_size
12
+ tmp[j] << ary[i + j]
13
+ end
14
+ i += row_size
15
+ end
16
+ tmp
17
+ end
18
+
19
+ def str_ary3(format)
20
+ ary = str_ary(format)
21
+ tmp = []
22
+ i = 0
23
+ while i < size
24
+ tmp << ary[i...(i + row_size)]
25
+ i += row_size
26
+ end
27
+ tmp
28
+ end
29
+
30
+ def inspect
31
+ tmp = str_ary2("%.Re")
32
+ tmp.map!{ |a| "['" + a.join("', '") + "']" }
33
+ sprintf("#<%s:%x, [%s]>", self.class, __id__, tmp.join(', '))
34
+ end
35
+
36
+ def pretty_print(pp)
37
+ ary = str_ary2("%.Re")
38
+ pp.object_group(self) do
39
+ pp.text(sprintf(':%x, ', __id__))
40
+ pp.breakable
41
+ pp.text("[")
42
+ pp.nest(1) do
43
+ for j in 0...row_size
44
+ pp.breakable if j > 0
45
+ pp.text(%|["#{ary[j][0]}"|)
46
+ pp.nest(1) do
47
+ for i in 1...column_size
48
+ pp.comma_breakable
49
+ pp.text(%|"#{ary[j][i]}"|)
50
+ end
51
+ end
52
+ pp.text("]")
53
+ pp.comma_breakable if j < row_size - 1
54
+ end
55
+ pp.text("]")
56
+ end
57
+ end
58
+ end
59
+
60
+ def to_s(f = "%.Ff", delimiter = ' ')
61
+ str_ary(f).join(delimiter)
62
+ end
63
+
64
+ def self.create(a)
65
+ case a
66
+ when MPFR::Vector
67
+ if self === a
68
+ a.dup
69
+ else
70
+ self.new(a.to_a)
71
+ end
72
+ when MPFR::Matrix
73
+ if a.column_size == a.row_size
74
+ if MPFR::SquareMatrix === a
75
+ a.dup
76
+ else
77
+ MPFR::SquareMatrix.new(a.to_a)
78
+ end
79
+ else
80
+ a.dup
81
+ end
82
+ when Array
83
+ if Array == a[0] && a.size == a[0].size
84
+ MPFR::SquareMatrix.new(a)
85
+ else
86
+ self.new(a)
87
+ end
88
+ else
89
+ self.new(a)
90
+ end
91
+
92
+ end
93
+
94
+ # ary is two-dimensional Array.
95
+ def self.suitable_matrix_from_ary(ary)
96
+ if ary.size == 1
97
+ RowVector.new(ary[0])
98
+ elsif ary[0].size == 1
99
+ ColumnVector.new(ary.inject([]){ |res, val| res << val[0] })
100
+ elsif ary[0].size == ary.size
101
+ SquareMatrix.new(ary)
102
+ else
103
+ Matrix.new(ary)
104
+ end
105
+ end
106
+
107
+ end
108
+
109
+ module Vector
110
+ def inspect
111
+ sprintf("#<%s:%x, ['%s']>", self.class, __id__, str_ary("%.Re").join("', '"))
112
+ end
113
+
114
+ def pretty_print(pp)
115
+ ary = str_ary("%.Re")
116
+ pp.object_group(self) do
117
+ pp.text(sprintf(':%x, ', __id__))
118
+ pp.breakable
119
+ pp.text(%|["#{ary[0]}"|)
120
+ pp.nest(1) do
121
+ for i in 1...dim
122
+ pp.comma_breakable
123
+ pp.text(%|"#{ary[i]}"|)
124
+ end
125
+ end
126
+ pp.text("]")
127
+ end
128
+ end
129
+
130
+ def to_s(format = "%.Re", delimiter = ' ')
131
+ str_ary(format).join(delimiter)
132
+ end
133
+
134
+ def self.inner_product(a, b)
135
+ a.inner_product(b)
136
+ end
137
+
138
+ def self.distance(a, b)
139
+ a.distance_from(b)
140
+ end
141
+
142
+ end
143
+
144
+ end
145
+
@@ -0,0 +1,3 @@
1
+ module MPFR
2
+ VERSION = '0.0.4'
3
+ end
data/ruby-mpfr.gemspec ADDED
@@ -0,0 +1,36 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{ruby-mpfr}
5
+ s.version = "0.0.4"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Takayuki YAMAGUCHI"]
9
+ s.date = %q{2009-12-17}
10
+ s.description = %q{ruby-mpfr is library to use MPFR[http://www.mpfr.org/] which is a C library for
11
+ multiple-precision floating-point computations.}
12
+ s.email = ["d@ytak.info"]
13
+ s.extensions = ["ext/mpfr/extconf.rb", "ext/mpfr_matrix/mpfr/extconf.rb"]
14
+ s.extra_rdoc_files = ["History.txt", "Manifest.txt", "PostInstall.txt", "README.rdoc"]
15
+ s.files = ["History.txt", "Manifest.txt", "PostInstall.txt", "README.rdoc", "Rakefile", "ext/mpfr/extconf.rb", "ext/mpfr/ruby_mpfr.c", "ext/mpfr/ruby_mpfr.h", "ext/mpfr_matrix/mpfr/extconf.rb", "ext/mpfr_matrix/mpfr/func_mpfr_matrix.c", "ext/mpfr_matrix/mpfr/func_mpfr_matrix.h", "ext/mpfr_matrix/mpfr/ruby_mpfr.h", "ext/mpfr_matrix/mpfr/ruby_mpfr_matrix.c", "ext/mpfr_matrix/mpfr/ruby_mpfr_matrix.h", "lib/mpfr/matrix.rb", "lib/mpfr/version.rb", "ruby-mpfr.gemspec", "script/console", "script/destroy", "script/generate", "spec/mpfr/allocate_spec.rb", "spec/mpfr/arithmetic_spec.rb", "spec/mpfr/comparison_spec.rb", "spec/mpfr/constant_spec.rb", "spec/mpfr/conversion_spec.rb", "spec/mpfr/exception_spec.rb", "spec/mpfr/functions_spec.rb", "spec/mpfr/generate_number_modulue.rb", "spec/mpfr/precision_roundmode_spec.rb", "spec/mpfr/rounding_spec.rb", "spec/mpfr/set_value_spec.rb", "spec/mpfr/spec_helper.rb", "spec/mpfr/string_spec.rb", "spec/mpfr_matrix/generate_matrix_arguments.rb", "spec/mpfr_matrix/mpfr_matrix_alloc_spec.rb", "spec/mpfr_matrix/mpfr_matrix_arithmetic_spec.rb", "spec/mpfr_matrix/mpfr_matrix_set_element_spec.rb", "spec/mpfr_matrix/mpfr_matrix_string_spec.rb", "spec/mpfr_matrix/mpfr_square_matrix_spec.rb", "spec/mpfr_matrix/spec_helper.rb", "spec/spec.opts", "tasks/extconf.rake"]
16
+ s.homepage = %q{http://rubyforge.org/projects/ruby-mpfr/}
17
+ s.post_install_message = %q{PostInstall.txt}
18
+ s.rdoc_options = ["--main", "README.rdoc"]
19
+ s.require_paths = ["lib", "ext"]
20
+ s.rubyforge_project = %q{ruby-mpfr}
21
+ s.rubygems_version = %q{1.3.5}
22
+ s.summary = %q{ruby-mpfr is library to use MPFR[http://www.mpfr.org/] which is a C library for multiple-precision floating-point computations.}
23
+
24
+ if s.respond_to? :specification_version then
25
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
26
+ s.specification_version = 3
27
+
28
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
29
+ s.add_development_dependency(%q<hoe>, [">= 2.4.0"])
30
+ else
31
+ s.add_dependency(%q<hoe>, [">= 2.4.0"])
32
+ end
33
+ else
34
+ s.add_dependency(%q<hoe>, [">= 2.4.0"])
35
+ end
36
+ end
@@ -0,0 +1,60 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe MPFR, 'when allocating objects from integer' do
4
+ it "should equal bignum" do
5
+ MPFR.set_default_prec(100)
6
+ num = 1
7
+ for i in 0..300
8
+ num *= 10
9
+ MPFR.new(num).should == num
10
+ end
11
+ end
12
+
13
+ it "should allocate from string" do
14
+ MPFR.set_default_prec(53)
15
+ for i in 0..1000
16
+ MPFR.new(i.to_s).should == i
17
+ end
18
+ end
19
+
20
+ it "should equal float" do
21
+ MPFR.set_default_prec(256)
22
+ error = MPFR.new('1.0e-10')
23
+ GenerateNumber.float(100) do |f|
24
+ MPFR.new(f).should == f
25
+ end
26
+ end
27
+
28
+ it "should duplicate" do
29
+ MPFR.set_default_prec(141)
30
+ for i in 0..1000
31
+ a = rand(10**10)
32
+ b = rand(10**50)
33
+ str = "#{a}.#{b}"
34
+ c = MPFR.new(str)
35
+ d = c.dup
36
+ c.should == d
37
+ c.object_id.should_not == d.object_id
38
+ end
39
+ end
40
+
41
+ it "should coerce" do
42
+ MPFR.set_default_prec(89)
43
+ a = MPFR.new('0.253242')
44
+ for i in 0..1000
45
+ b = MPFR.new(i)
46
+ c = a.coerce(i)[0]
47
+ b.should == c
48
+ end
49
+
50
+ a = MPFR.new('-13572834.923')
51
+ for i in 0..1000
52
+ str = (i + rand).to_s
53
+ b = MPFR.new(str)
54
+ c = a.coerce(str)[0]
55
+ b.should == c
56
+ end
57
+ end
58
+
59
+ end
60
+
@@ -0,0 +1,64 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ MPFR.set_default_prec(256)
4
+
5
+ def check_arithmetic_op(arg_ary, error, &block)
6
+ ruby_res = yield(*arg_ary)
7
+ mpfr_res = yield(*arg_ary.map{ |a| MPFR.new(a) })
8
+ mpfr_res = MPFR.new(mpfr_res) unless MPFR === mpfr_res
9
+ (ruby_res - mpfr_res).abs.should < error
10
+ end
11
+
12
+ describe MPFR, 'when calculating MPFR' do
13
+
14
+ it "should equal the result of built-in Numeric instance" do
15
+ error = 1.0e-10
16
+ arg = GenerateNumber.float_arguments(1, 1000)
17
+ arg << [0]
18
+ arg.each do |ary|
19
+ check_arithmetic_op(ary, error){ |a| a + 4 }
20
+ check_arithmetic_op(ary, error){ |a| 4 + a }
21
+ check_arithmetic_op(ary, error){ |a| a - 3 }
22
+ check_arithmetic_op(ary, error){ |a| 3 - a }
23
+ check_arithmetic_op(ary, error){ |a| a * 7 }
24
+ check_arithmetic_op(ary, error){ |a| 7 * a }
25
+ check_arithmetic_op(ary, error){ |a| a / 2 }
26
+ check_arithmetic_op(ary, error){ |a| (a.zero? ? 0 : 7 / a) }
27
+
28
+ check_arithmetic_op(ary, error){ |a| a + 4.0 }
29
+ check_arithmetic_op(ary, error){ |a| 4.0 + a }
30
+ check_arithmetic_op(ary, error){ |a| a - 3.0 }
31
+ check_arithmetic_op(ary, error){ |a| 3.0 - a }
32
+ check_arithmetic_op(ary, error){ |a| a * 7.0 }
33
+ check_arithmetic_op(ary, error){ |a| 7.0 * a }
34
+ check_arithmetic_op(ary, error){ |a| a / 2.0 }
35
+ check_arithmetic_op(ary, error){ |a| (a.zero? ? 0 : 7.0 / a) }
36
+ end
37
+ end
38
+
39
+ it "should equal the result of built-in Numeric instance" do
40
+ error = 1.0e-10
41
+ args = GenerateNumber.float_arguments(2, 1000)
42
+ args += [[0.0, 0.0], [0, -2.2], [0.0, 2.9], [1.1, 1000], [-23.1, 8.7]]
43
+
44
+ args.each do |ary|
45
+ check_arithmetic_op(ary, error){ |a, b| a + b }
46
+ check_arithmetic_op(ary, error){ |a, b| a - b }
47
+ check_arithmetic_op(ary, error){ |a, b| a * b }
48
+ check_arithmetic_op(ary, error){ |a, b| (b.zero? ? 0 : a / b) }
49
+ end
50
+ end
51
+
52
+ it "should equal the result of built-in Numeric instance" do
53
+ error = 1.0e-10
54
+ args = GenerateNumber.float_arguments(3, 1000)
55
+ args += [[0.0, 0.0, 0.0], [0, 0.0, -2.2], [0.0, 2.9, 0.0], [1.1, 1000, 0.0], [-23.1, 8.7, 0.0]]
56
+
57
+ args.each do |ary|
58
+ check_arithmetic_op(ary, error){ |a, b, c| a * a - b * b + c * c }
59
+ check_arithmetic_op(ary, error){ |a, b, c| (c.zero? ? (a + b * (-0.3) - c) / 3 : (a + b * (-0.3) - c) / (3 * c)) }
60
+ end
61
+ end
62
+
63
+ end
64
+
@@ -0,0 +1,21 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ MPFR.set_default_prec(256)
4
+
5
+ def check_comparison(a, b)
6
+ ((a < b) == (MPFR.new(a) < MPFR.new(b))).should be_true
7
+ ((a > b) == (MPFR.new(a) > MPFR.new(b))).should be_true
8
+ ((a == b) == (MPFR.new(a) == MPFR.new(b))).should be_true
9
+ end
10
+
11
+ describe MPFR, "when comparing two numbers" do
12
+ it "should return the same result to built-in Numeric comparison" do
13
+ args = GenerateNumber.float_arguments(2, 1000)
14
+ args += [[0.0, 0.0], [-2.89, -2.89], [5.2, 2.9], [1000, 1000], [8.7, 8.7]]
15
+
16
+ args.each do |ary|
17
+ check_comparison(*ary)
18
+ end
19
+ end
20
+ end
21
+
@@ -0,0 +1,23 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe MPFR, "when calling constant of MPFR" do
4
+ it "should be defined" do
5
+ MPFR::MPFR_VERSION.should be_true
6
+ MPFR::MPFR_PATCHES.should be_true
7
+ MPFR::MPFR_VERSION2.should be_true
8
+ MPFR::MPFR_VERSION_MAJOR.should be_true
9
+ MPFR::MPFR_VERSION_MINOR.should be_true
10
+ MPFR::MPFR_VERSION_PATCHLEVEL.should be_true
11
+ MPFR::MPFR_VERSION_STRING.should be_true
12
+ MPFR::PREC_MAX.should be_true
13
+ MPFR::PREC_MIN.should be_true
14
+ MPFR::EMAX_DEFAULT.should be_true
15
+ MPFR::EMIN_DEFAULT.should be_true
16
+ MPFR::RNDN.should be_true
17
+ MPFR::RNDZ.should be_true
18
+ MPFR::RNDU.should be_true
19
+ MPFR::RNDD.should be_true
20
+ # MPFR::VERSION
21
+ end
22
+ end
23
+
@@ -0,0 +1,14 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ MPFR.set_default_prec(90)
4
+
5
+ describe MPFR, 'when converting instance of other class' do
6
+ it "should be transformed to float" do
7
+ num = GenerateNumber.float(1000, 100) + [0.0]
8
+ num.each do |a|
9
+ b = MPFR.new(a).get_d(MPFR::RNDZ)
10
+ a.should == b
11
+ end
12
+ end
13
+ end
14
+
@@ -0,0 +1,60 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe MPFR, "when executing methods which are exception related functions" do
4
+ it "should get and set emin and emax" do
5
+ (emin = MPFR.get_emin).should be_a_kind_of Integer
6
+ (emax = MPFR.get_emax).should be_a_kind_of Integer
7
+ test_num = 1000
8
+ MPFR.set_emin(-test_num)
9
+ MPFR.get_emin.should == -test_num
10
+ MPFR.set_emax(test_num)
11
+ MPFR.get_emax.should == test_num
12
+ MPFR.set_emin(emin)
13
+ MPFR.set_emax(emax)
14
+ MPFR.get_emin_min.should be_a_kind_of Integer
15
+ MPFR.get_emin_max.should be_a_kind_of Integer
16
+ MPFR.get_emax_min.should be_a_kind_of Integer
17
+ MPFR.get_emax_max.should be_a_kind_of Integer
18
+ end
19
+ end
20
+
21
+ describe MPFR, "when executing exception of MPFR" do
22
+ it "should set exception" do
23
+ MPFR.set_underflow
24
+ MPFR.set_overflow
25
+ MPFR.set_nanflag
26
+ MPFR.set_inexflag
27
+ MPFR.set_erangeflag
28
+ MPFR.underflow_p.should be_true
29
+ MPFR.overflow_p.should be_true
30
+ MPFR.nanflag_p.should be_true
31
+ MPFR.inexflag_p.should be_true
32
+ MPFR.erangeflag_p.should be_true
33
+ MPFR.clear_underflow
34
+ MPFR.clear_overflow
35
+ MPFR.clear_nanflag
36
+ MPFR.clear_inexflag
37
+ MPFR.clear_erangeflag
38
+ MPFR.underflow_p.should be_false
39
+ MPFR.overflow_p.should be_false
40
+ MPFR.nanflag_p.should be_false
41
+ MPFR.inexflag_p.should be_false
42
+ MPFR.erangeflag_p.should be_false
43
+
44
+ MPFR.set_underflow
45
+ MPFR.set_overflow
46
+ MPFR.set_nanflag
47
+ MPFR.set_inexflag
48
+ MPFR.set_erangeflag
49
+ MPFR.clear_flags
50
+ MPFR.underflow_p.should be_false
51
+ MPFR.overflow_p.should be_false
52
+ MPFR.nanflag_p.should be_false
53
+ MPFR.inexflag_p.should be_false
54
+ MPFR.erangeflag_p.should be_false
55
+ end
56
+ end
57
+
58
+ # Need to spec for the following methods.
59
+ # check_range
60
+ # subnormalize
@@ -0,0 +1,25 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ MPFR.set_default_prec(256)
4
+
5
+ describe MPFR, 'when executing mathematical functions' do
6
+ it "should calculate basic functions" do
7
+ error = MPFR.new('1.0e-10')
8
+ a = MPFR::Math.const_pi
9
+ (MPFR.new(Math::PI) - a).abs.should < error
10
+ (MPFR::Math.sin(a) - MPFR.new('0')).abs.should < error
11
+ (MPFR::Math.cos(a) - MPFR.new('-1')).abs.should < error
12
+ a = MPFR.new(Math::PI/4.0)
13
+ (MPFR::Math.sin(a) - MPFR.new(Math.sqrt(2.0)/2.0)).abs.should < error
14
+ (MPFR::Math.cos(a) - MPFR.new(Math.sqrt(2.0)/2.0)).abs.should < error
15
+ (MPFR::Math.tan(a) - MPFR.new(1)).abs.should < error
16
+
17
+ (MPFR::Math.atan(MPFR.new(1) / MPFR::Math.sqrt('3')) - MPFR::Math.const_pi / MPFR.new(6)).abs.should < error
18
+
19
+ a = MPFR::Math.exp(1)
20
+ (Math::E - a).abs.should < error
21
+ (MPFR.new(1) - MPFR::Math.log(a)).abs.should < error
22
+ end
23
+ end
24
+
25
+
@@ -0,0 +1,44 @@
1
+ module GenerateNumber
2
+
3
+ def self.float_arguments(size, number, max = 100)
4
+ ret = Array.new(number){ |j| Array.new(size){ |i| rand(max) - rand } }
5
+ for i in 0...(ret.size)
6
+ case i % 4
7
+ when 1
8
+ ret[i].map!{ |a| -a }
9
+ when 2, 3
10
+ ret[i].map!{ |a| (rand > 0.5 ? -a : a) }
11
+ end
12
+ end
13
+ ret
14
+ end
15
+
16
+ def self.float(num, max = 100, &block)
17
+ if block_given?
18
+ for i in 0...num
19
+ a = rand(max) - rand
20
+ a = -a if rand > 0.5
21
+ yield(a)
22
+ end
23
+ else
24
+ ary = Array.new(num){ |i| rand(max) - rand }
25
+ ary.map!{ |a| (rand > 0.5 ? -a : a) }
26
+ end
27
+ end
28
+
29
+ def self.string(number)
30
+ prec = MPFR.get_default_prec
31
+ max = 2 ** prec
32
+ Array.new(number) do |i|
33
+ sign = ((rand > 0.5 ? '-' : ''))
34
+ "#{sign}#{rand(max)}.#{rand(max)}"
35
+ end
36
+ end
37
+
38
+ def self.mpfr_args(number)
39
+ ret = self.string(number)
40
+ ret.map!{ |a| MPFR.new(a) }
41
+ end
42
+
43
+
44
+ end
@@ -0,0 +1,65 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ def check_rnd(a)
4
+ MPFR.new(a).should == MPFR.new(a, MPFR.get_default_rounding_mode)
5
+ n = MPFR.new(a, MPFR::RNDN)
6
+ z = MPFR.new(a, MPFR::RNDZ)
7
+ u = MPFR.new(a, MPFR::RNDU)
8
+ d = MPFR.new(a, MPFR::RNDD)
9
+ (n > 0 ? d : u).should == z
10
+ [(a - z).abs, (a - u).abs, (a - d).abs].min.should >= (a - n).abs
11
+ (d <= u && (n == z || n == u || n == d)).should be_true
12
+ end
13
+
14
+ def check_set_rnd(rnd1, rnd2)
15
+ MPFR.set_default_rounding_mode(rnd1)
16
+ MPFR.get_default_rounding_mode.should == rnd1
17
+ MPFR.set_default_rounding_mode(rnd2)
18
+ MPFR.get_default_rounding_mode.should_not == rnd1
19
+ MPFR.get_default_rounding_mode.should == rnd2
20
+ end
21
+
22
+ describe MPFR, 'when getting rounding mode' do
23
+ it "should return rounding mode" do
24
+ args = GenerateNumber.float(100)
25
+ args += [Math::PI, -Math::PI, Math::E, -Math::E, 0, 10, 27, -9, -293578]
26
+ args.each{ |a| check_rnd(a) }
27
+ [MPFR::RNDN, MPFR::RNDZ, MPFR::RNDU, MPFR::RNDD].each{ |rnd| args.each{ |a| check_rnd(a) } }
28
+ end
29
+
30
+ it "should be set rounding mode" do
31
+ rnds = [MPFR::RNDN, MPFR::RNDZ, MPFR::RNDU, MPFR::RNDD]
32
+ for i in 0...rnds.size
33
+ for j in (i+1)...rnds.size
34
+ check_set_rnd(rnds[i], rnds[j])
35
+ end
36
+ end
37
+ end
38
+ end
39
+
40
+ def check_set_prec(prec)
41
+ MPFR.set_default_prec(prec)
42
+ MPFR.get_default_prec.should == prec
43
+ a = MPFR.new(rand(10000) - rand)
44
+ MPFR.get_default_prec.should == a.get_prec
45
+ prec2 = prec / 2
46
+ a.set_prec(prec2)
47
+ a.nan?.should be_true
48
+ MPFR.get_default_prec.should_not == a.get_prec
49
+ prec2.should == a.get_prec
50
+ b = MPFR.new(rand(10000) - rand)
51
+ prec3 = prec * 3
52
+ MPFR.set_default_prec(prec3)
53
+ c = MPFR.new(rand(10000) - rand)
54
+ prec3.should == c.get_prec
55
+ c.get_prec.should_not == b.get_prec
56
+ end
57
+
58
+ describe MPFR, 'when setting precision' do
59
+ it "should be set precision" do
60
+ for i in 1...1000
61
+ check_set_prec(20 + rand(i))
62
+ end
63
+ end
64
+ end
65
+
@@ -0,0 +1,51 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe MPFR, "when rounding number by prec_round" do
4
+ before(:all) do
5
+ MPFR.set_default_prec(200)
6
+ @prec = 100
7
+ @args = GenerateNumber.float(1000).map{ |a| MPFR.new(a.to_s) }
8
+ end
9
+
10
+ it "should be rounded up" do
11
+ @args.each do |a|
12
+ a.prec_round(MPFR::RNDU, @prec).should >= a
13
+ end
14
+ end
15
+
16
+ it "should be rounded down" do
17
+ @args.each do |a|
18
+ a.prec_round(MPFR::RNDD, @prec).should <= a
19
+ end
20
+ end
21
+
22
+ it "should be rounded to zero" do
23
+ @args.each do |a|
24
+ if a > 0
25
+ a.prec_round(MPFR::RNDZ, @prec).should <= a
26
+ else
27
+ a.prec_round(MPFR::RNDZ, @prec).should >= a
28
+ end
29
+ end
30
+ end
31
+
32
+ it "should be rounded to near number" do
33
+ @args.each do |a|
34
+ min = [(a - a.prec_round(MPFR::RNDU, @prec)).abs, (a - a.prec_round(MPFR::RNDD, @prec)).abs].min
35
+ (a - a.prec_round(MPFR::RNDN, @prec)).abs.should eql min
36
+ end
37
+ end
38
+
39
+ it "should be rounded by prec_round!" do
40
+ @args.each do |a|
41
+ [MPFR::RNDU, MPFR::RNDD, MPFR::RNDN, MPFR::RNDZ].each do |rnd|
42
+ b = a.dup
43
+ old_object_id = b.object_id
44
+ b.prec_round!(rnd, @prec)
45
+ b.should eql a.prec_round(rnd, @prec)
46
+ b.object_id.should eql old_object_id
47
+ end
48
+ end
49
+ end
50
+
51
+ end