flt 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. data/History.txt +41 -0
  2. data/License.txt +20 -0
  3. data/Manifest.txt +42 -0
  4. data/README.txt +557 -0
  5. data/Rakefile +34 -0
  6. data/lib/flt.rb +9 -0
  7. data/lib/flt/b.rb +6 -0
  8. data/lib/flt/bigdecimal.rb +151 -0
  9. data/lib/flt/bin_num.rb +250 -0
  10. data/lib/flt/d.rb +6 -0
  11. data/lib/flt/dec_num.rb +1239 -0
  12. data/lib/flt/float.rb +458 -0
  13. data/lib/flt/math.rb +66 -0
  14. data/lib/flt/num.rb +4211 -0
  15. data/lib/flt/sugar.rb +102 -0
  16. data/lib/flt/support.rb +1335 -0
  17. data/lib/flt/tolerance.rb +561 -0
  18. data/lib/flt/tolerance/sugar.rb +77 -0
  19. data/lib/flt/version.rb +9 -0
  20. data/setup.rb +1585 -0
  21. data/tasks/ann.rake +80 -0
  22. data/tasks/bones.rake +20 -0
  23. data/tasks/gem.rake +192 -0
  24. data/tasks/git.rake +40 -0
  25. data/tasks/manifest.rake +48 -0
  26. data/tasks/notes.rake +27 -0
  27. data/tasks/post_load.rake +39 -0
  28. data/tasks/rdoc.rake +50 -0
  29. data/tasks/rubyforge.rake +55 -0
  30. data/tasks/setup.rb +279 -0
  31. data/tasks/spec.rake +54 -0
  32. data/tasks/svn.rake +47 -0
  33. data/tasks/test.rake +40 -0
  34. data/test/all_tests.rb +23 -0
  35. data/test/helper.rb +101 -0
  36. data/test/reader.rb +68 -0
  37. data/test/test_basic.rb +396 -0
  38. data/test/test_bin.rb +245 -0
  39. data/test/test_bin_arithmetic.rb +94 -0
  40. data/test/test_binfloat_conversion.rb +24 -0
  41. data/test/test_coercion.rb +22 -0
  42. data/test/test_comparisons.rb +53 -0
  43. data/test/test_dectest.rb +216 -0
  44. data/test/test_define_conversions.rb +144 -0
  45. data/test/test_epsilon.rb +55 -0
  46. data/test/test_exact.rb +147 -0
  47. data/test/test_flags.rb +34 -0
  48. data/test/test_multithreading.rb +32 -0
  49. data/test/test_num_constructor.rb +133 -0
  50. data/test/test_odd_even.rb +78 -0
  51. data/test/test_round.rb +104 -0
  52. data/test/test_to_int.rb +104 -0
  53. data/test/test_to_rf.rb +36 -0
  54. data/test/test_tol.rb +102 -0
  55. data/test/test_ulp.rb +127 -0
  56. metadata +147 -0
@@ -0,0 +1,144 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__),'helper.rb'))
2
+
3
+ class TestDefineConversions < Test::Unit::TestCase
4
+
5
+
6
+ def setup
7
+ initialize_context
8
+ end
9
+
10
+ def test_convert_to
11
+ d = DecNum('1.1')
12
+ x = d.convert_to(Rational)
13
+ assert x.is_a?(Rational)
14
+ assert_equal d.to_r, x
15
+
16
+ d = DecNum('11')
17
+ x = d.convert_to(Integer)
18
+ assert x.is_a?(Integer)
19
+ assert_equal d.to_i, x
20
+
21
+ d = DecNum('11')
22
+ x = d.convert_to(Float)
23
+ assert x.is_a?(Float)
24
+ assert_equal d.to_f, x
25
+ end
26
+
27
+
28
+ def test_big_decimal_conversions
29
+
30
+ DecNum.local_context do
31
+
32
+ DecNum.context.define_conversion_from(BigDecimal) do |x, context|
33
+ DecNum(x.to_s) # or use x.split etc.
34
+ end
35
+ assert DecNum('0') == BigDecimal.new('0')
36
+ assert_equal BigDecimal.new('0'), DecNum('0')
37
+ assert_equal BigDecimal.new('1.2345'), DecNum('1.2345')
38
+ assert_equal BigDecimal.new('-1.2345'), DecNum('-1.2345')
39
+ assert_equal BigDecimal.new('1.2345'), DecNum('0.0012345000E3')
40
+ assert_equal DecNum('7.1'), BigDecimal.new('7')+DecNum('0.1')
41
+ assert_equal DecNum('7.1'), DecNum('7')+BigDecimal.new('0.1')
42
+ assert_equal DecNum('1.1'), DecNum(BigDecimal.new('1.1'))
43
+ assert DecNum(BigDecimal.new('1.1')).is_a?(DecNum)
44
+
45
+ DecNum.context.define_conversion_to(BigDecimal) do |x|
46
+ BigDecimal.new(x.to_s) # TODO: use x.split and handle special values
47
+ end
48
+
49
+ ['0.1', '-0.1', '0.0', '1234567.1234567', '-1234567.1234567', '1.234E7', '1.234E-7'].each do |n|
50
+ f = BigDecimal.new(n)
51
+ d = DecNum(n)
52
+ c = d.convert_to(BigDecimal)
53
+ assert c.is_a?(BigDecimal)
54
+ assert_equal f, c
55
+ end
56
+ end
57
+
58
+ assert_raise(TypeError) { DecNum('0') == BigDecimal.new('0') }
59
+ unless Num < Numeric
60
+ # BigDecimal#eql? is weird
61
+ assert_not_equal BigDecimal.new('0'), DecNum('0')
62
+ assert_not_equal BigDecimal.new('1.2345'), DecNum('1.2345')
63
+ assert_not_equal BigDecimal.new('-1.2345'), DecNum('-1.2345')
64
+ assert_not_equal BigDecimal.new('1.2345'), DecNum('0.0012345000E3')
65
+ assert_raise(TypeError) { BigDecimal.new('7')+DecNum('0.1') }
66
+ end
67
+ assert_raise(TypeError) { DecNum('7')+BigDecimal.new('0.1') }
68
+ assert_raise(TypeError) { DecNum(BigDecimal.new('1.1')) }
69
+
70
+ ['0.1', '-0.1', '0.0', '1234567.1234567', '-1234567.1234567', '1.234E7', '1.234E-7'].each do |n|
71
+ assert_raise(TypeError) { DecNum(n).convert_to(BigDecimal) }
72
+ end
73
+
74
+ end
75
+
76
+ def test_float_conversions
77
+
78
+ # Exact Float to DecNum conversion limited to context precision
79
+ # => DecNum('0.1') != DecNum(0.1) unless precision is low enough
80
+ DecNum.context.define_conversion_from(Float) do |x, context|
81
+ s,e = Math.frexp(x)
82
+ significand = Math.ldexp(s, Float::MANT_DIG).to_i
83
+ exponent = e - Float::MANT_DIG
84
+ # the number is (as a Rational) significand * exponent**Float::RADIX
85
+ DecNum(significand*(Float::RADIX**exponent ))
86
+ end
87
+
88
+ assert_equal 0.0, DecNum('0')
89
+ assert_equal DecNum('0'), 0.0
90
+ assert_equal 1234.5, DecNum('1234.5')
91
+ assert_equal DecNum('1234.5'), 1234.5
92
+ assert_equal(-1234.5, DecNum('-1234.5'))
93
+ assert_equal 1234.5, DecNum('0.0012345000E6')
94
+ assert_equal DecNum('7.1'), 7.0+DecNum('0.1')
95
+ DecNum.local_context(:precision=>12) do
96
+ assert_equal DecNum('7.1'), DecNum('7')+0.1
97
+ end
98
+ assert_equal DecNum('11'), DecNum(11.0)
99
+ assert_instance_of DecNum, DecNum(11.0)
100
+
101
+ DecNum.context.define_conversion_from(Float) do |x, context|
102
+ DecNum.context(context, :exact=>true) do
103
+ s,e = Math.frexp(x)
104
+ s = Math.ldexp(s, Float::MANT_DIG).to_i
105
+ e -= Float::MANT_DIG
106
+ DecNum(s*(Float::RADIX**e))
107
+ end
108
+ end
109
+
110
+ assert_equal '0.1000000000000000055511151231257827021181583404541015625', DecNum(0.1).to_s
111
+ assert_equal '1.100000000000000088817841970012523233890533447265625', DecNum(1.1).to_s
112
+
113
+ end
114
+
115
+ def test_conversion_types
116
+
117
+ assert_instance_of DecNum, DecNum(1)+3
118
+ assert_instance_of DecNum, 3+DecNum(1)
119
+ assert_instance_of DecNum, Rational(1,5)+DecNum(1)
120
+ assert_instance_of DecNum, DecNum(1)+Rational(1,5)
121
+ assert_instance_of Float, DecNum(1)+3.0
122
+ assert_instance_of Float, 3.0+DecNum(1)
123
+
124
+ DecNum.context.define_conversion_from(Float) do |x, context|
125
+ s,e = Math.frexp(x)
126
+ significand = Math.ldexp(s, Float::MANT_DIG).to_i
127
+ exponent = e - Float::MANT_DIG
128
+ # the number is (as a Rational) significand * exponent**Float::RADIX
129
+ DecNum(significand*(Float::RADIX**exponent ))
130
+ end
131
+
132
+ assert_instance_of DecNum, DecNum(1)+3.0
133
+ assert_instance_of DecNum, 3.0+DecNum(1)
134
+
135
+ DecNum.context.define_conversion_from(BigDecimal) do |x, context|
136
+ DecNum(x.to_s) # or use x.split etc.
137
+ end
138
+
139
+ assert_instance_of DecNum, DecNum(1)+BigDecimal('3')
140
+ assert_instance_of DecNum, BigDecimal('3')+DecNum(1)
141
+
142
+ end
143
+
144
+ end
@@ -0,0 +1,55 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__),'helper.rb'))
2
+
3
+ class TestEpsilon < Test::Unit::TestCase
4
+
5
+
6
+ def setup
7
+ initialize_context
8
+ end
9
+
10
+ def test_epsilon
11
+ eps = DecNum.context.epsilon
12
+ assert_equal((DecNum(1).next_plus - DecNum(1)), eps)
13
+ assert_equal DecNum(1,1,1-DecNum.context.precision), eps
14
+ end
15
+
16
+ def test_epsilon_bin
17
+ eps = BinNum.context.epsilon
18
+ assert_equal((BinNum(1).next_plus - BinNum(1)), eps)
19
+ assert_equal BinNum(1,1,1-BinNum.context.precision), eps
20
+ end
21
+
22
+ def test_strict_epsilon
23
+ [:up, :ceiling, :down, :floor, :half_up, :half_down, :half_even, :up05].each do |rounding|
24
+ DecNum.context.rounding = rounding
25
+ eps = DecNum.context.strict_epsilon
26
+ eps_1 = DecNum(1)+eps
27
+ r = eps.next_minus
28
+ r_1 = DecNum(1)+r
29
+ assert((eps_1 > DecNum(1)) && (r_1 == DecNum(1)), "Test strict epsilon for rounding #{rounding}")
30
+ assert_equal(((DecNum(1)+eps)-DecNum(1)), DecNum.context.epsilon)
31
+ end
32
+ end
33
+
34
+ def test_strict_epsilon_bin
35
+ [:up, :ceiling, :down, :floor, :half_up, :half_down, :half_even].each do |rounding|
36
+ BinNum.context.rounding = rounding
37
+ eps = BinNum.context.strict_epsilon
38
+ eps_1 = BinNum(1)+eps
39
+ r = eps.next_minus
40
+ r_1 = BinNum(1)+r
41
+ assert((eps_1 > BinNum(1)) && (r_1 == BinNum(1)), "Test strict binary epsilon for rounding #{rounding}")
42
+ assert_equal(((BinNum(1)+eps)-BinNum(1)), BinNum.context.epsilon)
43
+ end
44
+ end
45
+
46
+ def test_half_epsilon
47
+ assert_equal DecNum.context.epsilon/2, DecNum.context.half_epsilon
48
+ end
49
+
50
+ def test_half_epsilon_bin
51
+ assert_equal BinNum.context.epsilon/2, BinNum.context.half_epsilon
52
+ end
53
+
54
+
55
+ end
@@ -0,0 +1,147 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__),'helper.rb'))
2
+
3
+
4
+ class TestExact < Test::Unit::TestCase
5
+
6
+
7
+ def setup
8
+ initialize_context
9
+ end
10
+
11
+
12
+ def test_exact_no_traps
13
+
14
+ DecNum.context.exact = true
15
+ DecNum.context.traps[DecNum::Inexact] = false
16
+
17
+ assert_equal DecNum("9"*100+"E-50"), DecNum('1E50')-DecNum('1E-50')
18
+ assert !DecNum.context.flags[DecNum::Inexact]
19
+ assert_equal DecNum(2),DecNum(6)/DecNum(3)
20
+ assert !DecNum.context.flags[DecNum::Inexact]
21
+ assert_equal DecNum('1.5'),DecNum(6)/DecNum(4)
22
+ assert !DecNum.context.flags[DecNum::Inexact]
23
+ assert_equal DecNum('15241578780673678546105778281054720515622620750190521'), DecNum('123456789123456789123456789')*DecNum('123456789123456789123456789')
24
+ assert !DecNum.context.flags[DecNum::Inexact]
25
+ assert_equal DecNum(2), DecNum('4').sqrt
26
+ assert !DecNum.context.flags[DecNum::Inexact]
27
+ assert_equal DecNum(4), DecNum('16').sqrt
28
+ assert !DecNum.context.flags[DecNum::Inexact]
29
+
30
+ assert_equal DecNum('42398.78077199232'), DecNum('1.23456')*DecNum('34343.232222')
31
+ assert !DecNum.context.flags[DecNum::Inexact]
32
+ assert_equal DecNum('12.369885'), DecNum('210.288045')/DecNum('17')
33
+ assert !DecNum.context.flags[DecNum::Inexact]
34
+ assert_equal DecNum('25'),DecNum('125')/DecNum('5')
35
+ assert !DecNum.context.flags[DecNum::Inexact]
36
+ assert_equal DecNum('12345678900000000000.1234567890'),DecNum('1234567890E10')+DecNum('1234567890E-10')
37
+ assert !DecNum.context.flags[DecNum::Inexact]
38
+ assert_equal DecNum('39304'),DecNum('34').power(DecNum(3))
39
+ assert !DecNum.context.flags[DecNum::Inexact]
40
+ assert_equal DecNum('39.304'),DecNum('3.4').power(DecNum(3))
41
+ assert !DecNum.context.flags[DecNum::Inexact]
42
+ assert_equal DecNum('4'),DecNum('16').power(DecNum('0.5'))
43
+ assert !DecNum.context.flags[DecNum::Inexact]
44
+ assert_equal DecNum('4'),DecNum('10000.0').log10
45
+ assert !DecNum.context.flags[DecNum::Inexact]
46
+ assert_equal DecNum('-5'),DecNum('0.00001').log10
47
+ assert !DecNum.context.flags[DecNum::Inexact]
48
+ assert_equal DecNum.infinity, DecNum.infinity.exp
49
+ assert !DecNum.context.flags[DecNum::Inexact]
50
+ assert_equal DecNum.zero, DecNum.infinity(-1).exp
51
+ assert !DecNum.context.flags[DecNum::Inexact]
52
+ assert_equal DecNum(1), DecNum(0).exp
53
+ assert !DecNum.context.flags[DecNum::Inexact]
54
+ assert_equal DecNum.infinity(-1), DecNum(0).ln
55
+ assert !DecNum.context.flags[DecNum::Inexact]
56
+ assert_equal DecNum.infinity, DecNum.infinity.ln
57
+ assert !DecNum.context.flags[DecNum::Inexact]
58
+ assert_equal DecNum(0), DecNum(1).ln
59
+ assert !DecNum.context.flags[DecNum::Inexact]
60
+
61
+
62
+ assert((DecNum(1)/DecNum(3)).nan?)
63
+ assert DecNum.context.flags[DecNum::Inexact]
64
+ DecNum.context.flags[DecNum::Inexact] = false
65
+ assert((DecNum(18).power(DecNum('0.5'))).nan?)
66
+ assert DecNum.context.flags[DecNum::Inexact]
67
+ DecNum.context.flags[DecNum::Inexact] = false
68
+ assert((DecNum(18).power(DecNum('1.5'))).nan?)
69
+ assert DecNum.context.flags[DecNum::Inexact]
70
+ DecNum.context.flags[DecNum::Inexact] = false
71
+ assert DecNum(18).log10.nan?
72
+ assert DecNum.context.flags[DecNum::Inexact]
73
+ DecNum.context.flags[DecNum::Inexact] = false
74
+ assert DecNum(1).exp.nan?
75
+ assert DecNum.context.flags[DecNum::Inexact]
76
+ DecNum.context.flags[DecNum::Inexact] = false
77
+ assert DecNum('-1.2').exp.nan?
78
+ assert DecNum.context.flags[DecNum::Inexact]
79
+ DecNum.context.flags[DecNum::Inexact] = false
80
+ assert DecNum('1.1').ln.nan?
81
+ assert DecNum.context.flags[DecNum::Inexact]
82
+ DecNum.context.flags[DecNum::Inexact] = false
83
+
84
+ end
85
+
86
+ def test_exact_traps
87
+
88
+ DecNum.context.exact = true
89
+
90
+ assert_nothing_raised(DecNum::Inexact){ DecNum(6)/DecNum(4) }
91
+
92
+ assert_equal DecNum("9"*100+"E-50"), DecNum('1E50')-DecNum('1E-50')
93
+ assert !DecNum.context.flags[DecNum::Inexact]
94
+ assert_equal DecNum(2),DecNum(6)/DecNum(3)
95
+ assert !DecNum.context.flags[DecNum::Inexact]
96
+ assert_equal DecNum('1.5'),DecNum(6)/DecNum(4)
97
+ assert !DecNum.context.flags[DecNum::Inexact]
98
+ assert_equal DecNum('15241578780673678546105778281054720515622620750190521'), DecNum('123456789123456789123456789')*DecNum('123456789123456789123456789')
99
+ assert !DecNum.context.flags[DecNum::Inexact]
100
+ assert_equal DecNum(2), DecNum('4').sqrt
101
+ assert !DecNum.context.flags[DecNum::Inexact]
102
+ assert_equal DecNum(4), DecNum('16').sqrt
103
+ assert !DecNum.context.flags[DecNum::Inexact]
104
+ assert_equal DecNum.infinity, DecNum.infinity.exp
105
+ assert !DecNum.context.flags[DecNum::Inexact]
106
+ assert_equal DecNum.zero, DecNum.infinity(-1).exp
107
+ assert !DecNum.context.flags[DecNum::Inexact]
108
+ assert_equal DecNum(1), DecNum(0).exp
109
+ assert !DecNum.context.flags[DecNum::Inexact]
110
+
111
+ assert_equal DecNum('42398.78077199232'), DecNum('1.23456')*DecNum('34343.232222')
112
+ assert !DecNum.context.flags[DecNum::Inexact]
113
+ assert_equal DecNum('12.369885'), DecNum('210.288045')/DecNum('17')
114
+ assert !DecNum.context.flags[DecNum::Inexact]
115
+ assert_equal DecNum('25'),DecNum('125')/DecNum('5')
116
+ assert !DecNum.context.flags[DecNum::Inexact]
117
+ assert_equal DecNum('12345678900000000000.1234567890'),DecNum('1234567890E10')+DecNum('1234567890E-10')
118
+ assert !DecNum.context.flags[DecNum::Inexact]
119
+ assert_equal DecNum('39304'),DecNum('34').power(DecNum(3))
120
+ assert !DecNum.context.flags[DecNum::Inexact]
121
+ assert_equal DecNum('39.304'),DecNum('3.4').power(DecNum(3))
122
+ assert !DecNum.context.flags[DecNum::Inexact]
123
+ assert_equal DecNum('4'),DecNum('16').power(DecNum('0.5'))
124
+ assert !DecNum.context.flags[DecNum::Inexact]
125
+ assert_equal DecNum('4'),DecNum('10000.0').log10
126
+ assert !DecNum.context.flags[DecNum::Inexact]
127
+ assert_equal DecNum('-5'),DecNum('0.00001').log10
128
+ assert !DecNum.context.flags[DecNum::Inexact]
129
+ assert_equal DecNum.infinity(-1), DecNum(0).ln
130
+ assert !DecNum.context.flags[DecNum::Inexact]
131
+ assert_equal DecNum.infinity, DecNum.infinity.ln
132
+ assert !DecNum.context.flags[DecNum::Inexact]
133
+ assert_equal DecNum(0), DecNum(1).ln
134
+ assert !DecNum.context.flags[DecNum::Inexact]
135
+
136
+ assert_raise(DecNum::Inexact){ DecNum(2).sqrt }
137
+ assert_raise(DecNum::Inexact){ DecNum(1)/DecNum(3) }
138
+ assert_raise(DecNum::Inexact){ DecNum(18).power(DecNum('0.5')) }
139
+ assert_raise(DecNum::Inexact){ DecNum(18).power(DecNum('1.5')) }
140
+ assert_raise(DecNum::Inexact){ DecNum(18).log10 }
141
+ assert_raise(DecNum::Inexact){ DecNum(1).exp }
142
+ assert_raise(DecNum::Inexact){ DecNum('1.2').exp }
143
+ assert_raise(DecNum::Inexact){ DecNum('1.2').ln }
144
+
145
+ end
146
+
147
+ end
@@ -0,0 +1,34 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__),'helper.rb'))
2
+
3
+
4
+ class TestFlags < Test::Unit::TestCase
5
+
6
+ def test_flags
7
+ f = Flt::Support::Flags(:flag_one, :flag_three)
8
+ assert_equal "[:flag_one, :flag_three]", f.to_a.sort_by{|flg| flg.to_s}.inspect
9
+ f.values = Flt::Support::FlagValues(:flag_one, :flag_two, :flag_three)
10
+ assert_equal "Flt::Support::Flags[flag_one, flag_three] (0x5)", f.inspect
11
+ f[:flag_two] = true
12
+ assert_equal "Flt::Support::Flags[flag_one, flag_two, flag_three] (0x7)", f.inspect
13
+ f[:flag_one] = false
14
+ assert_equal "Flt::Support::Flags[flag_two, flag_three] (0x6)", f.inspect
15
+ f.clear!
16
+ assert_equal "Flt::Support::Flags[] (0x0)", f.inspect
17
+ f << [:flag_one,:flag_two]
18
+ assert_equal "Flt::Support::Flags[flag_one, flag_two] (0x3)", f.inspect
19
+ g = Flt::Support::Flags(f.values)
20
+ g.bits = f.bits
21
+ assert_equal "Flt::Support::Flags[flag_one, flag_two] (0x3)", g.inspect
22
+ assert g==f
23
+ g.set!
24
+ assert_equal "Flt::Support::Flags[flag_one, flag_two, flag_three] (0x7)", g.inspect
25
+ assert g!=f
26
+
27
+ assert Flt::Support::Flags(:flag_one, :flag_three)==Flt::Support::Flags(:flag_three, :flag_one)
28
+ assert Flt::Support::Flags(:flag_one, :flag_three)!=Flt::Support::Flags(:flag_one)
29
+
30
+
31
+
32
+ end
33
+
34
+ end
@@ -0,0 +1,32 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__),'helper.rb'))
2
+
3
+
4
+
5
+ class TestMultithreading < Test::Unit::TestCase
6
+
7
+ def setup
8
+ initialize_context
9
+ end
10
+
11
+ def test_concurrent_precision
12
+ threads = []
13
+ for prec in (5..100)
14
+ threads << Thread.new(prec) do |p|
15
+ n = 10000/(p/3)
16
+ n_fails = 0
17
+ DecNum.local_context do
18
+ DecNum.context.precision = p
19
+ n.times do
20
+ t = (DecNum(1)/DecNum(3)).to_s
21
+ n_fails += 1 if (t.size!=(p+2)) || (DecNum.context.precision!=p)
22
+ end
23
+ end
24
+ Thread.current[:n_fails] = n_fails
25
+ end
26
+ end
27
+ total_fails = 0
28
+ threads.each{|thr| thr.join; total_fails += thr[:n_fails]}
29
+ assert total_fails==0,"Context precision different per thread"
30
+ end
31
+
32
+ end
@@ -0,0 +1,133 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__),'helper.rb'))
2
+
3
+ class TestNumConstructor < Test::Unit::TestCase
4
+
5
+
6
+ def setup
7
+ initialize_context
8
+ DecNum.context.precision = 28
9
+ @dprec5 = DecNum::Context(:precision=>5)
10
+ @bprec5 = BinNum::Context(:precision=>5)
11
+ end
12
+
13
+ def test_direct
14
+ assert_equal [1, 1234, -2], DecNum(+1, 1234, -2).split
15
+ assert_equal [1, 1234, -2], DecNum(+1, 1234, -2, @dprec5).split
16
+ assert_equal [1, 1234, -2], DecNum(+1, 1234, -2, :precision=>2).split
17
+ assert_equal [1, 1234, -2], DecNum(+1, 1234, -2, nil).split
18
+
19
+ assert_equal [1, 1234, -2], BinNum(+1, 1234, -2).split
20
+ assert_equal [1, 1234, -2], BinNum(+1, 1234, -2, @bprec5).split
21
+ assert_equal [1, 1234, -2], BinNum(+1, 1234, -2, :precision=>2).split
22
+ assert_equal [1, 1234, -2], BinNum(+1, 1234, -2, nil).split
23
+ assert_equal [1, 1234, -2], BinNum(+1, 1234, -2, :xxx=>3).split
24
+ end
25
+
26
+ def test_conversion
27
+ assert_equal [1, 3333333333333333333333333333, -28], DecNum(Rational(1,3)).split
28
+ assert_equal [1, 33333, -5], DecNum(Rational(1,3), @dprec5).split
29
+ assert_equal [1, 33333, -5], DecNum(Rational(1,3), :precision=>5).split
30
+ assert_equal [1, 3333333333333333333333333333, -28], DecNum(Rational(1,3), nil).split
31
+
32
+ assert_equal [1, 6004799503160661, -54], BinNum(Rational(1,3)).split
33
+ assert_equal [1, 21, -6], BinNum(Rational(1,3), @bprec5).split
34
+ assert_equal [1, 21, -6], BinNum(Rational(1,3), :precision=>5).split
35
+ assert_equal [1, 6004799503160661, -54], BinNum(Rational(1,3), nil).split
36
+ end
37
+
38
+ def test_literal_free
39
+ assert_equal [1, 1234567, -8], DecNum('1.234567E-2', :free).split
40
+ assert_equal [1, 1234567, -8], DecNum('1.234567E-2', :free, :precision=>5).split
41
+ assert_equal [1, 1, -1], DecNum('0.1', :free).split
42
+ assert_equal [1, 1000, -4], DecNum('0.1000', :free).split
43
+ assert_equal [1, 1, -1], DecNum('0.1',:short).split
44
+ assert_equal [1, 1000, -4], DecNum('0.1000',:short).split
45
+
46
+ assert_equal [1, 1, -3], BinNum('0.1E-2', :free, :base=>2).split
47
+ assert_equal [1, 1, -1], BinNum('0.1', :free, :base=>2).split
48
+ assert_equal [1, 8, -4], BinNum('0.1000', :free, :base=>2).split
49
+ assert_equal [1, 1, -1], BinNum('0.1',:short, :base=>2).split
50
+ assert_equal [1, 8, -4], BinNum('0.1000',:short, :base=>2).split
51
+ end
52
+
53
+ def test_literal_free_base
54
+
55
+ assert_equal [1, 12, -2], DecNum('0.1E-2', :free, :base=>2).split
56
+ assert_equal [1, 13, -2], DecNum('0.1E-2', :free, :base=>2, :rounding=>:half_up).split
57
+ assert_equal [1, 1250, -4], DecNum('0.1000000E-2', :free, :base=>2).split
58
+ assert_equal [1, 125, -3], DecNum('0.1000000E-2', :short, :base=>2).split
59
+
60
+ assert_equal [1, 26, -8], BinNum('0.1', :free).split
61
+ assert_equal [1, 13107, -17], BinNum('0.1000', :free).split
62
+ assert_equal [1, 1, -3], BinNum('0.1',:short).split
63
+ assert_equal [1, 1639, -14], BinNum('0.1000',:short).split
64
+ end
65
+
66
+ def test_fixed
67
+
68
+ assert_equal [1, 1000000000000000000000000000, -28], DecNum('0.1',:fixed).split
69
+ assert_equal [1, 1000000000000000000000000000, -28], DecNum('0.1000',:fixed).split
70
+ assert_equal [1, 10000, -5], DecNum('0.1',:fixed,:precision=>5).split
71
+ assert_equal [1, 10000, -5], DecNum('0.1000',:fixed,:precision=>5).split
72
+ assert_equal [1, 10000, -5], DecNum('0.1',:fixed,@dprec5).split
73
+ assert_equal [1, 10000, -5], DecNum('0.1000',:fixed,@dprec5).split
74
+ DecNum.context(:precision=>5) do
75
+ assert_equal [1, 10000, -5], DecNum('0.1',:fixed).split
76
+ assert_equal [1, 10000, -5], DecNum('0.1000',:fixed).split
77
+ end
78
+
79
+ assert_equal [1, 4503599627370496, -53], BinNum('0.1',:fixed,:base=>2).split
80
+ assert_equal [1, 4503599627370496, -53], BinNum('0.1000',:fixed,:base=>2).split
81
+ assert_equal [1, 16, -5], BinNum('0.1',:fixed,:precision=>5,:base=>2).split
82
+ assert_equal [1, 16, -5], BinNum('0.1000',:fixed,:precision=>5,:base=>2).split
83
+ context = BinNum::Context(:precision=>5)
84
+ assert_equal [1, 16, -5], BinNum('0.1',:fixed,context,:base=>2).split
85
+ assert_equal [1, 16, -5], BinNum('0.1000',:fixed,context,:base=>2).split
86
+ BinNum.context(:precision=>5) do
87
+ assert_equal [1, 16, -5], BinNum('0.1',:fixed,:base=>2).split
88
+ assert_equal [1, 16, -5], BinNum('0.1000',:fixed,:base=>2).split
89
+ end
90
+ end
91
+
92
+ def test_fixed_base
93
+ assert_equal [1, 7205759403792794, -56], BinNum('0.1',:fixed).split
94
+ assert_equal [1, 7205759403792794, -56], BinNum('0.1000',:fixed).split
95
+ assert_equal [1, 26, -8], BinNum('0.1',:fixed,:precision=>5).split
96
+ assert_equal [1, 26, -8], BinNum('0.1000',:fixed,:precision=>5).split
97
+ assert_equal [1, 26, -8], BinNum('0.1',:fixed,@bprec5).split
98
+ assert_equal [1, 26, -8], BinNum('0.1000',:fixed,@bprec5).split
99
+ BinNum.context(:precision=>5) do
100
+ assert_equal [1, 26, -8], BinNum('0.1',:fixed).split
101
+ assert_equal [1, 26, -8], BinNum('0.1000',:fixed).split
102
+ end
103
+
104
+ assert_equal [1, 5000000000000000000000000000, -28], DecNum('0.1',:fixed,:base=>2).split
105
+ assert_equal [1, 5000000000000000000000000000, -28], DecNum('0.1000',:fixed,:base=>2).split
106
+ assert_equal [1, 50000, -5], DecNum('0.1',:fixed,:precision=>5,:base=>2).split
107
+ assert_equal [1, 50000, -5], DecNum('0.1000',:fixed,:precision=>5,:base=>2).split
108
+ assert_equal [1, 50000, -5], DecNum('0.1',:fixed,@dprec5,:base=>2).split
109
+ assert_equal [1, 50000, -5], DecNum('0.1000',:fixed,@dprec5,:base=>2).split
110
+ DecNum.context(:precision=>5) do
111
+ assert_equal [1, 50000, -5], DecNum('0.1',:fixed,:base=>2).split
112
+ assert_equal [1, 50000, -5], DecNum('0.1000',:fixed,:base=>2).split
113
+ end
114
+
115
+ end
116
+
117
+ def test_default
118
+ assert_equal [1, 1234567, -8], DecNum('1.234567E-2').split
119
+ assert_equal [1, 1234567, -8], DecNum('1.234567E-2', :precision=>5).split
120
+ assert_equal [1, 1, -1], DecNum('0.1').split
121
+ assert_equal [1, 1000, -4], DecNum('0.1000').split
122
+ assert_equal [1, 1, -3], BinNum('0.1E-2', :base=>2).split
123
+ assert_equal [1, 1, -1], BinNum('0.1', :base=>2).split
124
+ assert_equal [1, 8, -4], BinNum('0.1000', :base=>2).split
125
+ # base conversion
126
+ assert_equal [1, 12, -2], DecNum('0.1E-2', :base=>2, :rounding=>:half_even).split
127
+ assert_equal [1, 13, -2], DecNum('0.1E-2', :base=>2, :rounding=>:half_up).split
128
+ assert_equal [1, 26, -8], BinNum('0.1').split
129
+ assert_equal [1, 13107, -17], BinNum('0.1000').split
130
+ end
131
+
132
+
133
+ end