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,77 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ MPFR.set_default_prec(300)
4
+
5
+ describe MPFR, 'when setting abnormal number' do
6
+ it "should be set nan" do
7
+ a = MPFR.new(rand)
8
+ a.set_nan
9
+ a.nan?.should be_true
10
+ a.to_s.should == "nan"
11
+ end
12
+
13
+ it "should be set infinity" do
14
+ a = MPFR.new(rand)
15
+ a.set_inf(0)
16
+ a.infinite?.should be_true
17
+ a.to_s.should == "inf"
18
+
19
+ a.set_inf(1)
20
+ a.infinite?.should be_true
21
+ a.to_s.should == "inf"
22
+
23
+ a.set_inf(-1)
24
+ a.infinite?.should be_true
25
+ a.to_s.should == "-inf"
26
+ end
27
+ end
28
+
29
+ describe MPFR, 'when setting value' do
30
+ it "should swap each other" do
31
+ num = 100
32
+ args = [GenerateNumber.mpfr_args(num), GenerateNumber.mpfr_args(num)]
33
+ args[0].each_index{ |i| check_swap(args[0][i], args[1][i]) }
34
+ end
35
+
36
+ it "should set other value" do
37
+ [0, 3, 2.2, -0.2, '1.0e-3', '-2e14', '2225'].each{ |val| check_set(val) }
38
+ end
39
+
40
+ it "should set value by set_fixnum_2exp" do
41
+ for i in 0..100
42
+ check_fixnum_2exp(rand(100), rand(100))
43
+ end
44
+ end
45
+ end
46
+
47
+ def check_swap(a, b)
48
+ tmp_a = a.dup
49
+ tmp_b = b.dup
50
+ tmp_a.swap(tmp_b)
51
+ a.should == tmp_b
52
+ b.should == tmp_a
53
+ end
54
+
55
+ def check_set(val)
56
+ tmp = MPFR.new
57
+ tmp.set(val)
58
+ tmp2 = tmp.dup
59
+ a = (tmp2 + 3) / Math::PI
60
+ tmp.nan?.should_not be_true
61
+ tmp.should_not == a
62
+ end
63
+
64
+ def check_fixnum_2exp(num, exp)
65
+ ret = MPFR.new(num)
66
+ if exp < 0
67
+ for i in 0...(exp.abs)
68
+ ret /= MPFR.new(2)
69
+ end
70
+ else
71
+ for i in 0...exp
72
+ ret *= MPFR.new(2)
73
+ end
74
+ end
75
+ MPFR.new.set_fixnum_2exp(num, exp).should == ret
76
+ end
77
+
@@ -0,0 +1,13 @@
1
+ begin
2
+ require 'spec'
3
+ rescue LoadError
4
+ require 'rubygems' unless ENV['NO_RUBYGEMS']
5
+ gem 'rspec'
6
+ require 'spec'
7
+ end
8
+
9
+ $:.unshift(File.dirname(__FILE__) + '/../../lib')
10
+ $:.unshift(File.dirname(__FILE__) + '/../../ext')
11
+ $:.unshift(File.dirname(__FILE__))
12
+ require 'mpfr'
13
+ require "generate_number_modulue"
@@ -0,0 +1,58 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe MPFR, "when converted to string" do
4
+ before(:all) do
5
+ MPFR.set_default_prec(200)
6
+ @args = GenerateNumber.float(10).map{ |a| MPFR.new(a.to_s) }
7
+ end
8
+
9
+ it "should be to_s" do
10
+ @args.each do |a|
11
+ a.to_s.should match(/^(-|)[1-9]\.[0-9]+e[-+][0-9]+$/)
12
+ end
13
+ end
14
+
15
+ it "should be formatted string \"#<MPFR:%lx,'%.Re',%d>\" for inspect" do
16
+ @args.each do |a|
17
+ a.inspect.should match(/^#<MPFR:.+,'(-|)[1-9]\.[0-9]+e[-+][0-9]+',\d+>$/)
18
+ end
19
+ end
20
+
21
+ it "should be formatted string by to_strf" do
22
+ @args.each do |a|
23
+ a.to_strf("%.Re").should eql a.to_s
24
+ a.to_strf("%.RE").should match(/^(-|)[1-9]\.[0-9]+E[-+][0-9]+$/)
25
+ a.to_strf("%.Rf").should match(/^(-|)[0-9]*\.[0-9]*$/)
26
+ end
27
+
28
+ format = ["14.6", ".8", "10.10", "+10.4", "-10.4", "+012.2", "-012.2", "3.0"]
29
+ @args.each do |a|
30
+ MPFR.set_default_prec(100)
31
+ for i in 0...1000
32
+ a = rand(100) + rand
33
+ check_to_s_e(a, format)
34
+ check_to_s_e(-a, format)
35
+ # check_to_s_f(a, format)
36
+ # check_to_s_f(-a, format)
37
+ end
38
+ end
39
+ end
40
+
41
+ end
42
+
43
+ def check_to_s_e(float, format_ary)
44
+ a = MPFR.new(float)
45
+ format_ary.each do |format|
46
+ sprintf("%#{format}e", float).should == a.to_strf("%#{format}Re")
47
+ sprintf("%#{format}E", float).should == a.to_strf("%#{format}RE")
48
+ end
49
+ end
50
+
51
+ # Probably MPFR bug makes this test be failure. Need further investigations. (Tue Aug 18 10:43:51 2009)
52
+ def check_to_s_f(float, format_ary)
53
+ a = MPFR.new(float)
54
+ format_ary.each do |format|
55
+ sprintf("%#{format}f", float).should == a.to_strf("%#{format}Rf")
56
+ end
57
+ end
58
+
@@ -0,0 +1,55 @@
1
+ module GenerateNumber
2
+
3
+ def self.float_matrix_arguments(number, row, column, max = 100)
4
+ ret = []
5
+ (0...number).each do
6
+ ret << Array.new(row){ |j| Array.new(column){ |i| rand(max) - rand } }
7
+ for i in 0...(ret[-1].size)
8
+ ret[-1][i].map!{ |a| (rand > 0.5 ? -a : a) }
9
+ end
10
+ end
11
+ ret
12
+ end
13
+
14
+ def self.float_arguments(size, number, max = 100)
15
+ ret = Array.new(number){ |j| Array.new(size){ |i| rand(max) - rand } }
16
+ for i in 0...(ret.size)
17
+ case i % 4
18
+ when 1
19
+ ret[i].map!{ |a| -a }
20
+ when 2, 3
21
+ ret[i].map!{ |a| (rand > 0.5 ? -a : a) }
22
+ end
23
+ end
24
+ ret
25
+ end
26
+
27
+ def self.float(num, max = 100, &block)
28
+ if block_given?
29
+ for i in 0...num
30
+ a = rand(max) - rand
31
+ a = -a if rand > 0.5
32
+ yield(a)
33
+ end
34
+ else
35
+ ary = Array.new(num){ |i| rand(max) - rand }
36
+ ary.map!{ |a| (rand > 0.5 ? -a : a) }
37
+ end
38
+ end
39
+
40
+ def self.string(number)
41
+ prec = MPFR.get_default_prec
42
+ max = 2 ** prec
43
+ Array.new(number) do |i|
44
+ sign = ((rand > 0.5 ? '-' : ''))
45
+ "#{sign}#{rand(max)}.#{rand(max)}"
46
+ end
47
+ end
48
+
49
+ def self.mpfr_args(number)
50
+ ret = self.string(number)
51
+ ret.map!{ |a| MPFR.new(a) }
52
+ end
53
+
54
+
55
+ end
@@ -0,0 +1,126 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe "initialization of matrix" do
4
+ before(:all) do
5
+ MPFR.set_default_prec(128)
6
+ @sizes = [[1, 2], [2, 3], [8, 5], [7, 3]]
7
+ @matrixes = @sizes.map{ |a| MPFR::Matrix.new(*a) }
8
+ end
9
+
10
+ it "should has size which equals size of array." do
11
+ @matrixes.each_with_index do |a, i|
12
+ a.size.should == (@sizes[i][0] * @sizes[i][1])
13
+ end
14
+ end
15
+
16
+ it "should has size of row which equals size of array." do
17
+ @matrixes.each_with_index do |a, i|
18
+ a.row_size.should == @sizes[i][0]
19
+ end
20
+ end
21
+
22
+ it "should has size of column which equals size of array." do
23
+ @matrixes.each_with_index do |a, i|
24
+ a.column_size.should == @sizes[i][1]
25
+ end
26
+ end
27
+
28
+ it "should have MPFR instances as elements." do
29
+ @matrixes.each do |m|
30
+ m.each { |a| a.should be_an_instance_of MPFR }
31
+ end
32
+ end
33
+
34
+ end
35
+
36
+ describe "argument error raises for invalid initialization argument" do
37
+ before(:all) do
38
+ MPFR.set_default_prec(256)
39
+ @data = [[[1, 2, 3], [0, 0]],
40
+ [[MPFR.new(0)], [MPFR.new(1), 3]]]
41
+ end
42
+
43
+ it "should make error for invalid array argument" do
44
+ @data.each do |ary|
45
+ lambda { MPFR::Matrix.new(ary) }.should raise_error ArgumentError
46
+ end
47
+ end
48
+ end
49
+
50
+ describe "when methods of matrix 'dup' and 'transpose' are executed" do
51
+ before(:all) do
52
+ MPFR.set_default_prec(256)
53
+ @data = [[[1, 2], [3, 3]],
54
+ [[-1, 0.8], ['1.2342', 99]],
55
+ [[36.237582938, 7122], ['-1e7', 8237]],
56
+ [[-2.2738, 8.23, 9.237482], [11, '8237.2374', '1239']],
57
+ [[MPFR.new('23'), MPFR.new('123.23')], [MPFR.new(-3.2378), MPFR.new('1.2837')]]]
58
+ @matrixes = @data.map{ |a| MPFR::Matrix.new(a) }
59
+ end
60
+
61
+ it "should have MPFR instances as elements." do
62
+ @matrixes.each do |m|
63
+ m.each { |a| a.should be_an_instance_of MPFR }
64
+ end
65
+ end
66
+
67
+ it "should create matrix which has same values as original and different object id." do
68
+ @matrixes.each do |m|
69
+ new = m.dup
70
+ m.object_id.should_not == new.object_id
71
+ m.should == new
72
+ end
73
+ end
74
+
75
+ it "should has transposed values." do
76
+ @matrixes.each do |m|
77
+ id = m.object_id
78
+ old = m.dup
79
+ new = m.transpose
80
+ m.transpose!
81
+ m.should_not == old
82
+ m.should == new
83
+ m.object_id.should == id
84
+ m.object_id.should_not == new.object_id
85
+ m.column_size.should == old.row_size
86
+ m.row_size.should == old.column_size
87
+ end
88
+ end
89
+ end
90
+
91
+ describe "when methods of vector 'dup' and 'transpose' are executed" do
92
+ before(:all) do
93
+ MPFR.set_default_prec(768)
94
+ @data = [[1, 2, 3, 3],
95
+ [-1, 0.8, '1.2342', 99],
96
+ [36.237582938, 7122, '-1e7', 8237],
97
+ [-2.2738, 8.23, 9.237482, '8237.2374', '1239'],
98
+ [MPFR.new('23'), MPFR.new('123.23'), MPFR.new(-3.2378), MPFR.new('1.2837')]]
99
+ @column = @data.map{ |a| MPFR::ColumnVector.new(a) }
100
+ @row = @data.map{ |a| MPFR::RowVector.new(a) }
101
+ end
102
+
103
+ it "should create matrix which has same values as original and different object id." do
104
+ (@column + @row).each do |m|
105
+ new = m.dup
106
+ m.object_id.should_not == new.object_id
107
+ m.should == new
108
+ end
109
+ end
110
+
111
+ it "should change row vector to column vector and make the opposite changes" do
112
+ (@column + @row).each do |m|
113
+ id = m.object_id
114
+ old = m.dup
115
+ new = m.transpose
116
+ m.transpose!
117
+ m.should_not == old
118
+ m.should == new
119
+ m.object_id.should == id
120
+ m.object_id.should_not == new.object_id
121
+ m.column_size.should == old.row_size
122
+ m.row_size.should == old.column_size
123
+ end
124
+ end
125
+
126
+ end
@@ -0,0 +1,93 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe MPFR::Matrix, "when making matrix negative" do
4
+ before(:all) do
5
+ MPFR.set_default_prec(512)
6
+ @row = 8
7
+ @column = 3
8
+ @args = GenerateNumber.float_matrix_arguments(1000, @row, @column).map{ |a| MPFR::Matrix.new(a) }
9
+ end
10
+
11
+ it "should be negative" do
12
+ zero_matrix = MPFR::Matrix.new(@row, @column)
13
+ @args.each { |m| (zero_matrix - m).should == m.neg }
14
+ end
15
+
16
+ end
17
+
18
+ describe MPFR::Matrix, "when arithmetic operator applies to 2x3 matrixies" do
19
+ before(:all) do
20
+ MPFR.set_default_prec(128)
21
+ @row = 2
22
+ @column = 3
23
+ @args = GenerateNumber.float_matrix_arguments(1000, @row, @column).map!{ |a| MPFR::Matrix.new(a) }
24
+ end
25
+
26
+ it "should be added" do
27
+ @args.each_index do |i|
28
+ if i > 0
29
+ res = @args[i-1] + @args[i]
30
+ (0...@row).each do |j|
31
+ (0...@column).each { |k| res[j, k].should eql(@args[i-1][j, k] + @args[i][j, k]) }
32
+ end
33
+ end
34
+ end
35
+ end
36
+
37
+ it "should be subtracted" do
38
+ @args.each_index do |i|
39
+ if i > 0
40
+ res = @args[i-1] + @args[i]
41
+ (0...@row).each do |j|
42
+ (0...@column).each { |k| res[j, k].should eql(@args[i-1][j, k] + @args[i][j, k]) }
43
+ end
44
+ end
45
+ end
46
+ end
47
+
48
+ it "should be multiplied" do
49
+ @args.each_index do |i|
50
+ if i > 0
51
+ trans = @args[i].transpose
52
+ res = @args[i-1] * trans
53
+ (0...@row).each do |j|
54
+ (0...@row).each do |k|
55
+ res2 = MPFR.new(0)
56
+ (0...@column).each { |l| res2 += @args[i-1][j, l] * trans[l, k] }
57
+ res[j, k].should eql res2
58
+ end
59
+ end
60
+ trans = @args[i-1].transpose
61
+ res = trans * @args[i]
62
+ (0...@column).each do |j|
63
+ (0...@column).each do |k|
64
+ res2 = MPFR.new(0)
65
+ (0...@row).each { |l| res2 += trans[j, l] * @args[i][l, k] }
66
+ res[j, k].should eql res2
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+
73
+ it "should be multyplied by scalar" do
74
+ @args.each do |a|
75
+ scalar = MPFR.new(GenerateNumber.float(1)[0])
76
+ res = a.mul_scalar(scalar)
77
+ (0...@row).each do |j|
78
+ (0...@column).each { |k| res[j, k].should eql a[j, k] * scalar }
79
+ end
80
+ end
81
+ end
82
+
83
+ it "should be divided by scalar" do
84
+ @args.each do |a|
85
+ scalar = MPFR.new(GenerateNumber.float(1)[0])
86
+ res = a.div_scalar(scalar)
87
+ (0...@row).each do |j|
88
+ (0...@column).each { |k| res[j, k].should eql a[j, k] / scalar }
89
+ end
90
+ end
91
+ end
92
+
93
+ end
@@ -0,0 +1,55 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe MPFR::Matrix, "when setting number to particular element" do
4
+ before(:all) do
5
+ MPFR.set_default_prec(128)
6
+ @row = 4
7
+ @column = 7
8
+ @matrix = MPFR::Matrix.new(@row, @column)
9
+ @source = GenerateNumber.float_matrix_arguments(1, @row, @column)[0]
10
+ end
11
+
12
+ it "should have elements which equals to source number." do
13
+ (0...(@matrix.row_size)).each do |i|
14
+ (0...(@matrix.column_size)).each do |j|
15
+ fr = MPFR.new(@source[i][j].to_s)
16
+ @matrix.set_element(i, j, fr)
17
+ @matrix[i, j].should eql fr
18
+ end
19
+ end
20
+ end
21
+
22
+ end
23
+
24
+ describe MPFR::Matrix, "when calculating row and column" do
25
+ before(:all) do
26
+ MPFR.set_default_prec(128)
27
+ @row = 6
28
+ @column = 4
29
+ @sources = GenerateNumber.float_matrix_arguments(100, @row, @column)
30
+ @matrixies = @sources.map { |a| MPFR::Matrix.new(a) }
31
+ end
32
+
33
+ it "should have row vector." do
34
+ @matrixies.each do |m|
35
+ (0...(m.column_size)).each do |i|
36
+ col = m.column(i)
37
+ (0...(m.row_size)).each do |j|
38
+ col[j].should eql m[j, i]
39
+ end
40
+ end
41
+ end
42
+ end
43
+
44
+ it "should have column vector." do
45
+ @matrixies.each do |m|
46
+ (0...(m.row_size)).each do |i|
47
+ row = m.row(i)
48
+ (0...(m.column_size)).each do |j|
49
+ row[j].should eql m[i, j]
50
+ end
51
+ end
52
+ end
53
+ end
54
+
55
+ end
@@ -0,0 +1,31 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe MPFR::Matrix, "when MPFR instance is converted to string by some methods." do
4
+
5
+ before(:all) do
6
+ MPFR.set_default_prec(128)
7
+ @row = 2
8
+ @column = 3
9
+ @matrixes = ((0..100).map { |i| MPFR::Matrix.new(GenerateNumber.float_arguments(@column, @row)) })
10
+ end
11
+
12
+ it "should return array having strings." do
13
+ @matrixes.each do |m|
14
+ m.str_ary("%.Re").each_with_index do |s, i|
15
+ s.to_s.should eql m[i % @row, i / @row].to_s
16
+ end
17
+ end
18
+ end
19
+
20
+ it "should return inspect string." do
21
+ @matrixes.each do |m|
22
+ ins = m.inspect
23
+ ins.should match(/#{Regexp.escape(sprintf("%x", m.object_id))}/)
24
+ m.each do |a|
25
+ ins.should match(/#{Regexp.escape(a.to_s)}/)
26
+ end
27
+ end
28
+ end
29
+
30
+ end
31
+
@@ -0,0 +1,75 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe MPFR::SquareMatrix, "when calculating LU decomposition" do
4
+ before(:all) do
5
+ MPFR.set_default_prec(128)
6
+ @dim = 7
7
+ @matrixies = GenerateNumber.float_matrix_arguments(100, @dim, @dim).map{ |a| MPFR::SquareMatrix.new(a) }
8
+ @error = MPFR.new('1e-30')
9
+ end
10
+
11
+ it "should have lu decomposition" do
12
+ @matrixies.each do |mat|
13
+ l, u, indx = mat.lu_decomp
14
+ if l
15
+ mul = l * u
16
+ (0...(indx.size)).to_a.reverse.each do |i|
17
+ if i != indx[i]
18
+ row = mul.row(i)
19
+ (0...(mul.column_size)).each do |j|
20
+ mul.set_element(i, j, mul[indx[i], j])
21
+ mul.set_element(indx[i], j, row[j])
22
+ end
23
+ end
24
+ end
25
+ (0...(mat.row_size)).each do |i|
26
+ (0...(mat.column_size)).each do |j|
27
+ (mat[i, j] - mul[i, j]).abs.should < @error
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ describe MPFR::SquareMatrix, "when calculating determinant" do
36
+ before(:all) do
37
+ MPFR.set_default_prec(512)
38
+ @error = MPFR.new('1e-30')
39
+ end
40
+
41
+ it "should have the same values of determinant by formula and lu decomposition" do
42
+ [2, 3].each do |dim|
43
+ GenerateNumber.float_matrix_arguments(100, dim, dim).each do |src|
44
+ m = MPFR::SquareMatrix.new(src)
45
+ l, u, idx = m.lu_decomp
46
+ if l
47
+ det = MPFR.new(1)
48
+ (0...(u.row_size)).each { |i| det *= u[i, i] }
49
+ count = 0
50
+ idx.each_with_index { |ind, i| count += (ind != i ? 1 : 0) }
51
+ det = -det if count % 2 == 1
52
+ (det - m.determinant).should < @error
53
+ end
54
+ end
55
+ end
56
+ end
57
+
58
+ it "should have the same values of determinant by formula and lu decomposition" do
59
+ [4, 5, 6].each do |dim|
60
+ GenerateNumber.float_matrix_arguments(100, dim, dim).each do |src|
61
+ m = MPFR::SquareMatrix.new(src)
62
+ l, u, idx = m.lu_decomp
63
+ if l
64
+ det = MPFR.new(1)
65
+ (0...(u.row_size)).each { |i| det *= u[i, i] }
66
+ count = 0
67
+ idx.each_with_index { |ind, i| count += (ind != i ? 1 : 0) }
68
+ det = -det if count % 2 == 1
69
+ (det - m.determinant).should < @error
70
+ end
71
+ end
72
+ end
73
+ end
74
+
75
+ end
@@ -0,0 +1,16 @@
1
+ begin
2
+ require 'spec'
3
+ rescue LoadError
4
+ require 'rubygems' unless ENV['NO_RUBYGEMS']
5
+ gem 'rspec'
6
+ require 'spec'
7
+ end
8
+
9
+ $:.unshift(File.dirname(__FILE__) + '/../../lib')
10
+ $:.unshift(*Dir.glob(File.dirname(__FILE__) + '/../../ext/*'))
11
+ $:.unshift(File.dirname(__FILE__))
12
+
13
+ require 'mpfr'
14
+ require 'mpfr/matrix'
15
+ require "generate_matrix_arguments"
16
+
@@ -0,0 +1,36 @@
1
+ begin
2
+ require 'spec'
3
+ rescue LoadError
4
+ require 'rubygems' unless ENV['NO_RUBYGEMS']
5
+ require 'spec'
6
+ end
7
+ begin
8
+ require 'spec/rake/spectask'
9
+ rescue LoadError
10
+ puts <<-EOS
11
+ To use rspec for testing you must install rspec gem:
12
+ gem install rspec
13
+ EOS
14
+ exit(0)
15
+ end
16
+
17
+ desc "Run 'make realclean' for extended libraries"
18
+ task "ext:realclean" do
19
+ Dir.glob("ext/**/Makefile").each do |path|
20
+ system("cd #{File.dirname(path)}; make realclean")
21
+ end
22
+ end
23
+
24
+ desc "Run 'make clean' for extended libraries"
25
+ task "ext:clean" do
26
+ Dir.glob("ext/**/Makefile").each do |path|
27
+ system("cd #{File.dirname(path)}; make clean")
28
+ end
29
+ end
30
+
31
+ desc "Run 'make realclean' for extended libraries"
32
+ task 'ext:make' do
33
+ Dir.glob("ext/**/extconf.rb").each do |path|
34
+ system("cd #{File.dirname(path)}; ruby extconf.rb && make")
35
+ end
36
+ end