flt 1.0.0

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 (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