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