flt 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +41 -0
- data/License.txt +20 -0
- data/Manifest.txt +42 -0
- data/README.txt +557 -0
- data/Rakefile +34 -0
- data/lib/flt.rb +9 -0
- data/lib/flt/b.rb +6 -0
- data/lib/flt/bigdecimal.rb +151 -0
- data/lib/flt/bin_num.rb +250 -0
- data/lib/flt/d.rb +6 -0
- data/lib/flt/dec_num.rb +1239 -0
- data/lib/flt/float.rb +458 -0
- data/lib/flt/math.rb +66 -0
- data/lib/flt/num.rb +4211 -0
- data/lib/flt/sugar.rb +102 -0
- data/lib/flt/support.rb +1335 -0
- data/lib/flt/tolerance.rb +561 -0
- data/lib/flt/tolerance/sugar.rb +77 -0
- data/lib/flt/version.rb +9 -0
- data/setup.rb +1585 -0
- data/tasks/ann.rake +80 -0
- data/tasks/bones.rake +20 -0
- data/tasks/gem.rake +192 -0
- data/tasks/git.rake +40 -0
- data/tasks/manifest.rake +48 -0
- data/tasks/notes.rake +27 -0
- data/tasks/post_load.rake +39 -0
- data/tasks/rdoc.rake +50 -0
- data/tasks/rubyforge.rake +55 -0
- data/tasks/setup.rb +279 -0
- data/tasks/spec.rake +54 -0
- data/tasks/svn.rake +47 -0
- data/tasks/test.rake +40 -0
- data/test/all_tests.rb +23 -0
- data/test/helper.rb +101 -0
- data/test/reader.rb +68 -0
- data/test/test_basic.rb +396 -0
- data/test/test_bin.rb +245 -0
- data/test/test_bin_arithmetic.rb +94 -0
- data/test/test_binfloat_conversion.rb +24 -0
- data/test/test_coercion.rb +22 -0
- data/test/test_comparisons.rb +53 -0
- data/test/test_dectest.rb +216 -0
- data/test/test_define_conversions.rb +144 -0
- data/test/test_epsilon.rb +55 -0
- data/test/test_exact.rb +147 -0
- data/test/test_flags.rb +34 -0
- data/test/test_multithreading.rb +32 -0
- data/test/test_num_constructor.rb +133 -0
- data/test/test_odd_even.rb +78 -0
- data/test/test_round.rb +104 -0
- data/test/test_to_int.rb +104 -0
- data/test/test_to_rf.rb +36 -0
- data/test/test_tol.rb +102 -0
- data/test/test_ulp.rb +127 -0
- 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
|
data/test/test_exact.rb
ADDED
@@ -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
|
data/test/test_flags.rb
ADDED
@@ -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
|