float-formats 0.2.1 → 0.3.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.
- checksums.yaml +4 -4
- data/History.txt +5 -0
- data/README.md +3 -3
- data/float-formats.gemspec +5 -2
- data/lib/float-formats/bytes.rb +7 -10
- data/lib/float-formats/classes.rb +144 -100
- data/lib/float-formats/formats.rb +256 -255
- data/lib/float-formats/native.rb +9 -54
- data/lib/float-formats/version.rb +1 -1
- data/test/test_bytes.rb +44 -38
- data/test/test_data.yaml +172 -172
- data/test/test_float_formats.rb +49 -47
- data/test/test_native-float.rb +1 -1
- metadata +22 -8
data/test/test_float_formats.rb
CHANGED
@@ -7,7 +7,7 @@ class TestFloatFormats < Test::Unit::TestCase
|
|
7
7
|
|
8
8
|
def setup
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
def test_nextprev
|
12
12
|
for tn in %w{IEEE_SINGLE IEEE_DOUBLE IEEE_EXTENDED IEEE_DEC32 IEEE_DEC64 IEEE_DEC128}
|
13
13
|
t = eval(tn)
|
@@ -22,14 +22,14 @@ class TestFloatFormats < Test::Unit::TestCase
|
|
22
22
|
assert z.next_minus==t.min_value(-1),"#{tn}: prv 0 == -min"
|
23
23
|
assert mz.next_plus==t.min_value,"#{tn}: nxt -0 == min"
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
for tn in %w{
|
27
|
-
APPLE XS128
|
27
|
+
APPLE XS128
|
28
28
|
BORLAND48
|
29
|
-
MBF_SINGLE MBF_DOUBLE
|
30
|
-
IEEE_SINGLE IEEE_DOUBLE IEEE_EXTENDED IEEE_128
|
29
|
+
MBF_SINGLE MBF_DOUBLE
|
30
|
+
IEEE_SINGLE IEEE_DOUBLE IEEE_EXTENDED IEEE_128
|
31
31
|
IEEE_DEC32 IEEE_DEC64 IEEE_DEC128
|
32
|
-
XS256 XS256_DOUBLE
|
32
|
+
XS256 XS256_DOUBLE
|
33
33
|
SATURN SATURN_X HP_CLASSIC
|
34
34
|
VAX_F VAX_D PDP11_F PDP11_D VAX_G VAX_H
|
35
35
|
IBM32 IBM64 IBM128 IBMX
|
@@ -44,38 +44,40 @@ class TestFloatFormats < Test::Unit::TestCase
|
|
44
44
|
mu = t.from_text('-1')
|
45
45
|
assert u.next_plus.minus == mu.next_minus,"#{tn}: -nxt 1 == prv -1"
|
46
46
|
assert mu.next_plus == u.next_minus.minus,"#{tn}: nxt -1 == -prv 1"
|
47
|
-
|
48
|
-
end
|
49
|
-
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
50
|
end
|
51
|
-
|
51
|
+
|
52
52
|
TEST_DATA = YAML.load(File.read(File.join(File.dirname(__FILE__),'test_data.yaml')))
|
53
53
|
|
54
54
|
|
55
55
|
def test_all
|
56
56
|
|
57
57
|
TEST_DATA.keys.each do |t|
|
58
|
-
|
58
|
+
|
59
59
|
flt = eval(t)
|
60
|
-
|
60
|
+
|
61
61
|
base = TEST_DATA[t]['base']
|
62
|
-
|
62
|
+
|
63
63
|
td = TEST_DATA[t]['parameters']
|
64
|
-
|
64
|
+
|
65
65
|
#puts "def test_#{t}_parameters"
|
66
|
-
for pair in td
|
67
|
-
attrb,v = pair.to_a.first
|
66
|
+
for pair in td
|
67
|
+
attrb,v = pair.to_a.first
|
68
68
|
#puts " assert_equal #{v}, #{t}.#{attrb}"
|
69
69
|
assert_equal v, flt.send(attrb), "#{t}.#{attrb} == #{v}"
|
70
|
-
end
|
70
|
+
end
|
71
71
|
#puts "end"
|
72
|
-
|
73
|
-
|
72
|
+
|
73
|
+
|
74
74
|
td = TEST_DATA[t]['numerals']
|
75
75
|
#puts "def test_#{t}_numerals"
|
76
76
|
for pair in td
|
77
|
-
v,rep = pair.to_a.first
|
77
|
+
v,rep = pair.to_a.first
|
78
|
+
# v_expr = "#{t}.from_text('#{v}', :free, exact_input: false)"
|
78
79
|
v_expr = "#{t}.from_text('#{v}')"
|
80
|
+
|
79
81
|
expr = base==:bytes ? "(#{v_expr}).to_hex(true)" : "(#{v_expr}).to_bits_text(#{base}).upcase"
|
80
82
|
#puts " assert_equal '#{rep}', #{expr}"
|
81
83
|
assert_equal rep, eval(expr), "#{expr} == '#{rep}'"
|
@@ -87,19 +89,19 @@ class TestFloatFormats < Test::Unit::TestCase
|
|
87
89
|
td = TEST_DATA[t]['special']
|
88
90
|
#puts "def test_#{t}_special"
|
89
91
|
for pair in td
|
90
|
-
v,rep = pair.to_a.first
|
92
|
+
v,rep = pair.to_a.first
|
91
93
|
#next if v=='epsilon'
|
92
94
|
v_expr = "#{t}.#{v}"
|
93
95
|
expr = base==:bytes ? "(#{v_expr}).to_hex(true)" : "(#{v_expr}).to_bits_text(#{base}).upcase"
|
94
96
|
assert_equal rep, eval(expr), "#{expr} == '#{rep}'"
|
95
97
|
end
|
96
98
|
#puts "end"
|
97
|
-
|
99
|
+
|
98
100
|
|
99
101
|
td = TEST_DATA[t]['values']
|
100
102
|
#puts "def test_#{t}_values"
|
101
103
|
for pair in td
|
102
|
-
v,rep = pair.to_a.first
|
104
|
+
v,rep = pair.to_a.first
|
103
105
|
v_expr = "#{t}.from_number(#{v})"
|
104
106
|
expr = base==:bytes ? "(#{v_expr}).to_hex(true)" : "(#{v_expr}).to_bits_text(#{base}).upcase"
|
105
107
|
assert_equal rep, eval(expr), "#{expr} == '#{rep}'"
|
@@ -107,9 +109,9 @@ class TestFloatFormats < Test::Unit::TestCase
|
|
107
109
|
#puts "end"
|
108
110
|
|
109
111
|
|
110
|
-
end
|
111
|
-
|
112
|
-
end
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
113
115
|
|
114
116
|
|
115
117
|
|
@@ -117,11 +119,11 @@ class TestFloatFormats < Test::Unit::TestCase
|
|
117
119
|
assert_equal(-499, HP71B.radix_min_exp)
|
118
120
|
assert_equal(499, HP71B.radix_max_exp)
|
119
121
|
|
120
|
-
fmt =
|
122
|
+
fmt = Numerals::Format[precision: 12, symbols: [uppercase: true]]
|
121
123
|
assert_equal '9.99999999999E499', HP71B.max_value.to_text(fmt)
|
122
124
|
assert_equal '0000000000001501', HP71B.min_value.to_bits_text(16)
|
123
|
-
assert_equal '
|
124
|
-
assert_equal '
|
125
|
+
assert_equal '1.0E-510', HP71B.min_value.to_text(fmt)
|
126
|
+
assert_equal '1.00000000000E-499', HP71B.min_normalized_value.to_text(fmt)
|
125
127
|
|
126
128
|
assert_equal '9210000000000999',HP71B.from_text('-0.21').to_bits_text(16)
|
127
129
|
assert_equal '0100000000000001',HP71B.from_text('10').to_bits_text(16)
|
@@ -137,39 +139,39 @@ class TestFloatFormats < Test::Unit::TestCase
|
|
137
139
|
def test_quad
|
138
140
|
assert_equal "3fff 0000 0000 0000 0000 0000 0000 0000".tr(' ',''), IEEE_binary128_BE.from_text('1').to_hex.downcase
|
139
141
|
assert_equal "7ffe ffff ffff ffff ffff ffff ffff ffff".tr(' ',''), IEEE_binary128_BE.max_value.to_hex.downcase
|
140
|
-
assert_equal '1.
|
142
|
+
assert_equal '1.190e4932', IEEE_binary128.max_value.to_text(Numerals::Format[precision: 4])
|
141
143
|
assert_equal "c000 0000 0000 0000 0000 0000 0000 0000".tr(' ',''), IEEE_binary128_BE.from_text('-2').to_hex.downcase
|
142
144
|
assert_equal "0000 0000 0000 0000 0000 0000 0000 0000".tr(' ',''), IEEE_binary128_BE.from_text('0').to_hex.downcase
|
143
145
|
assert_equal "8000 0000 0000 0000 0000 0000 0000 0000".tr(' ',''), IEEE_binary128_BE.from_text('-0').to_hex.downcase
|
144
146
|
assert_equal "7fff 0000 0000 0000 0000 0000 0000 0000".tr(' ',''), IEEE_binary128_BE.infinity.to_hex.downcase
|
145
147
|
assert_equal "ffff 0000 0000 0000 0000 0000 0000 0000".tr(' ',''), IEEE_binary128_BE.infinity(-1).to_hex.downcase
|
146
148
|
assert_equal "3ffd 5555 5555 5555 5555 5555 5555 5555".tr(' ',''), IEEE_binary128_BE.from_number(Rational(1,3)).to_hex.downcase
|
147
|
-
assert_equal "3fff 0000 0000 0000 0000 0000 0000 0001".tr(' ',''), IEEE_binary128_BE.from_text('1').next_plus.to_hex.downcase
|
149
|
+
assert_equal "3fff 0000 0000 0000 0000 0000 0000 0001".tr(' ',''), IEEE_binary128_BE.from_text('1').next_plus.to_hex.downcase
|
148
150
|
end
|
149
151
|
def test_half
|
150
152
|
assert_equal "3c00", IEEE_binary16_BE.from_text('1').to_hex.downcase
|
151
153
|
assert_equal "7bff", IEEE_binary16_BE.max_value.to_hex.downcase
|
152
|
-
assert_equal '65504', IEEE_binary16_BE.max_value.to_text(
|
154
|
+
assert_equal '65504', IEEE_binary16_BE.max_value.to_text(Numerals::Format[:exact_input])
|
153
155
|
assert_equal "0400", IEEE_binary16_BE.min_normalized_value.to_hex.downcase
|
154
|
-
assert_equal "6.
|
156
|
+
assert_equal "6.103515625e-5", IEEE_binary16_BE.min_normalized_value.to_text(Numerals::Format[:sci, :exact_input])
|
155
157
|
assert_equal "0001", IEEE_binary16_BE.min_value.to_hex.downcase
|
156
|
-
assert_equal "5.
|
158
|
+
assert_equal "5.9604644775390625e-8", IEEE_binary16_BE.min_value.to_text(Numerals::Format[:sci, :exact_input])
|
157
159
|
assert_equal "0000", IEEE_binary16_BE.from_text('0').to_hex.downcase
|
158
160
|
assert_equal "8000", IEEE_binary16_BE.from_text('-0').to_hex.downcase
|
159
161
|
assert_equal "7c00".tr(' ',''), IEEE_binary16_BE.infinity.to_hex.downcase
|
160
162
|
assert_equal "fc00".tr(' ',''), IEEE_binary16_BE.infinity(-1).to_hex.downcase
|
161
163
|
end
|
162
164
|
def test_special
|
163
|
-
assert_equal '+Infinity', IEEE_binary32.from_number(1.0/0.0).to_text
|
164
|
-
assert_equal '-Infinity', IEEE_binary32.from_number(-1.0/0.0).to_text
|
165
|
-
assert_equal '+Infinity', IEEE_binary32.from_text('+Infinity').to_text
|
166
|
-
assert_equal '-Infinity', IEEE_binary32.from_text('-Infinity').to_text
|
165
|
+
assert_equal '+Infinity', IEEE_binary32.from_number(1.0/0.0).to_text
|
166
|
+
assert_equal '-Infinity', IEEE_binary32.from_number(-1.0/0.0).to_text
|
167
|
+
assert_equal '+Infinity', IEEE_binary32.from_text('+Infinity').to_text
|
168
|
+
assert_equal '-Infinity', IEEE_binary32.from_text('-Infinity').to_text
|
167
169
|
assert_equal 'NAN', IEEE_binary32.from_number(0.0/0.0).to_text.upcase
|
168
170
|
assert_equal 'NAN', IEEE_binary32.from_text('NaN').to_text.upcase
|
169
171
|
end
|
170
|
-
|
172
|
+
|
171
173
|
def test_double_double
|
172
|
-
|
174
|
+
|
173
175
|
assert_equal 128, IEEE_DOUBLE_DOUBLE.total_bits
|
174
176
|
assert_equal 16, IEEE_DOUBLE_DOUBLE.total_bytes
|
175
177
|
assert_equal 107, IEEE_DOUBLE_DOUBLE.significand_digits
|
@@ -179,30 +181,30 @@ class TestFloatFormats < Test::Unit::TestCase
|
|
179
181
|
assert_equal(-307, IEEE_DOUBLE_DOUBLE.decimal_min_exp)
|
180
182
|
assert_equal 1023, IEEE_DOUBLE_DOUBLE.radix_max_exp
|
181
183
|
assert_equal(-1022, IEEE_DOUBLE_DOUBLE.radix_min_exp)
|
182
|
-
fmt =
|
184
|
+
fmt = Numerals::Format[:exact_input, precision: 2, symbols:[uppercase: true]]
|
183
185
|
assert_equal '1.8E308', IEEE_DOUBLE_DOUBLE.max_value.to_text(fmt)
|
184
186
|
assert_equal '2.2E-308', IEEE_DOUBLE_DOUBLE.min_normalized_value.to_text(fmt)
|
185
187
|
assert_equal '4.9E-324', IEEE_DOUBLE_DOUBLE.half.min_value.to_text(fmt)
|
186
|
-
|
188
|
+
|
187
189
|
assert_equal "0.5", IEEE_DOUBLE_DOUBLE('0.5').to_text
|
188
190
|
assert_equal "000000000000E03F0000000000000000", IEEE_DOUBLE_DOUBLE('0.5').to_hex
|
189
191
|
assert_equal "000000000000E03F0000000000004039", IEEE_DOUBLE_DOUBLE('0.5').next_plus.to_hex
|
190
192
|
assert_equal "9A9999999999B93F9A999999999959BC", IEEE_DOUBLE_DOUBLE('0.1').to_hex
|
191
193
|
assert_equal "9A9999999999B93F99999999999959BC", IEEE_DOUBLE_DOUBLE('0.1').next_plus.to_hex
|
192
|
-
|
194
|
+
|
193
195
|
assert_equal IEEE_DOUBLE_DOUBLE('0.5'), IEEE_DOUBLE_DOUBLE.join_halfs(*IEEE_DOUBLE_DOUBLE('0.5').split_halfs)
|
194
196
|
assert_equal IEEE_DOUBLE_DOUBLE('0.5').next_plus, IEEE_DOUBLE_DOUBLE.join_halfs(*IEEE_DOUBLE_DOUBLE('0.5').next_plus.split_halfs)
|
195
197
|
assert_equal IEEE_DOUBLE_DOUBLE('0.1'), IEEE_DOUBLE_DOUBLE.join_halfs(*IEEE_DOUBLE_DOUBLE('0.1').split_halfs)
|
196
198
|
assert_equal IEEE_DOUBLE_DOUBLE('0.1').next_plus, IEEE_DOUBLE_DOUBLE.join_halfs(*IEEE_DOUBLE_DOUBLE('0.1').next_plus.split_halfs)
|
197
|
-
|
198
|
-
assert_equal "00000000000050390000000000000000", IEEE_DOUBLE_DOUBLE.epsilon.to_hex
|
199
|
+
|
200
|
+
assert_equal "00000000000050390000000000000000", IEEE_DOUBLE_DOUBLE.epsilon.to_hex
|
199
201
|
assert_equal "000000000000F87F0000000000000000", IEEE_DOUBLE_DOUBLE.nan.to_hex
|
200
202
|
assert_equal "NAN", IEEE_DOUBLE_DOUBLE.nan.to_text.upcase
|
201
203
|
assert_equal "000000000000F07F0000000000000000", IEEE_DOUBLE_DOUBLE.infinity.to_hex
|
202
204
|
assert_equal "+INFINITY", IEEE_DOUBLE_DOUBLE.infinity.to_text.upcase
|
203
205
|
assert_equal "00000000000000000000000000000000", IEEE_DOUBLE_DOUBLE.zero.to_hex
|
204
|
-
assert_equal "0", IEEE_DOUBLE_DOUBLE.zero.to_text.upcase
|
206
|
+
assert_equal "0", IEEE_DOUBLE_DOUBLE.zero.to_text.upcase
|
205
207
|
end
|
206
|
-
|
208
|
+
|
207
209
|
|
208
210
|
end
|
data/test/test_native-float.rb
CHANGED
@@ -29,7 +29,7 @@ class TestNativeFloat < Test::Unit::TestCase
|
|
29
29
|
def test_hex
|
30
30
|
if Float::RADIX==2 && Float::MANT_DIG==53
|
31
31
|
assert_equal((1.0+Float::EPSILON),hex_to_float('0x1.0000000000001p0'))
|
32
|
-
assert_equal '
|
32
|
+
assert_equal '0x1.0000000000001p0', hex_from_float(1.0+Float::EPSILON)
|
33
33
|
end
|
34
34
|
assert_equal 1.0, hex_to_float(hex_from_float(1.0))
|
35
35
|
assert_equal(-1.0, hex_to_float(hex_from_float(-1.0)))
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: float-formats
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Javier Goizueta
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-04-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: flt
|
@@ -16,28 +16,28 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.
|
19
|
+
version: 1.4.7
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 1.
|
26
|
+
version: 1.4.7
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: numerals
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.
|
33
|
+
version: 0.3.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 0.
|
40
|
+
version: 0.3.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: bundler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: nio
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 0.2.4
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.2.4
|
69
83
|
description: Floating-Point Formats
|
70
84
|
email:
|
71
85
|
- jgoizueta@gmail.com
|
@@ -109,7 +123,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
109
123
|
requirements:
|
110
124
|
- - ">="
|
111
125
|
- !ruby/object:Gem::Version
|
112
|
-
version:
|
126
|
+
version: 1.9.3
|
113
127
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
114
128
|
requirements:
|
115
129
|
- - ">="
|