4 if Object.const_defined?(:Float)
6 assert('Float', '15.2.9') do
7 assert_equal Class, Float.class
10 assert('Float#+', '15.2.9.3.1') do
11 a = 3.123456788 + 0.000000001
14 assert_float(3.123456789, a)
15 assert_float(4.123456789, b)
17 assert_raise(TypeError){ 0.0+nil }
18 assert_raise(TypeError){ 1.0+nil }
21 assert('Float#-', '15.2.9.3.2') do
22 a = 3.123456790 - 0.000000001
25 assert_float(3.123456789, a)
26 assert_float(4.123456789, b)
29 assert('Float#*', '15.2.9.3.3') do
33 assert_float(9.765625, a)
34 assert_float(3.125 , b)
37 assert('Float#/', '15.2.9.3.4') do
38 a = 3.123456789 / 3.123456789
42 assert_float(3.123456789, b)
45 assert('Float#%', '15.2.9.3.5') do
50 assert_float(0.125, b)
53 assert('Float#<=>', '15.2.9.3.6') do
67 assert('Float#==', '15.2.9.3.7') do
68 assert_true 3.1 == 3.1
69 assert_false 3.1 == 3.2
72 assert('Float#ceil', '15.2.9.3.8') do
84 assert('Float#finite?', '15.2.9.3.9') do
85 assert_predicate 3.123456789, :finite?
86 assert_not_predicate 1.0 / 0.0, :finite?
89 assert('Float#floor', '15.2.9.3.10') do
92 c = -3.123456789.floor
101 assert('Float#infinite?', '15.2.9.3.11') do
102 a = 3.123456789.infinite?
103 b = (1.0 / 0.0).infinite?
104 c = (-1.0 / 0.0).infinite?
111 assert('Float#round', '15.2.9.3.12') do
112 a = 3.123456789.round
115 d = (-3.123456789).round
117 f = 12345.67.round(-1)
118 g = 3.423456789.round(0)
119 h = 3.423456789.round(1)
120 i = 3.423456789.round(3)
127 assert_equal(12350, f)
129 assert_float( 3.4, h)
130 assert_float(3.423, i)
132 assert_equal(42.0, 42.0.round(307))
133 assert_equal(1.0e307, 1.0e307.round(2))
136 assert_raise(FloatDomainError){ inf.round }
137 assert_raise(FloatDomainError){ inf.round(-1) }
138 assert_equal(inf, inf.round(1))
140 assert_raise(FloatDomainError){ nan.round }
141 assert_raise(FloatDomainError){ nan.round(-1) }
142 assert_predicate(nan.round(1), :nan?)
145 assert('Float#to_f', '15.2.9.3.13') do
148 assert_float(a, a.to_f)
151 assert('Float#to_i', '15.2.9.3.14') do
152 assert_equal(3, 3.123456789.to_i)
153 assert_raise(FloatDomainError) { Float::INFINITY.to_i }
154 assert_raise(FloatDomainError) { (-Float::INFINITY).to_i }
155 assert_raise(FloatDomainError) { Float::NAN.to_i }
158 assert('Float#truncate', '15.2.9.3.15') do
159 assert_equal( 3, 3.123456789.truncate)
160 assert_equal(-3, -3.1.truncate)
163 assert('Float#divmod') do
164 def check_floats exp, act
165 assert_float exp[0], act[0]
166 assert_float exp[1], act[1]
169 # Note: quotients are Float because mruby does not have Bignum.
170 check_floats [ 0, 0.0], 0.0.divmod(1)
171 check_floats [ 0, 1.1], 1.1.divmod(3)
172 check_floats [ 3, 0.2], 3.2.divmod(1)
173 check_floats [ 2, 6.3], 20.3.divmod(7)
174 check_floats [-1, 1.6], -3.4.divmod(5)
175 check_floats [-2, -0.5], 25.5.divmod(-13)
176 check_floats [ 1, -6.6], -13.6.divmod(-7)
177 check_floats [ 3, 0.2], 9.8.divmod(3.2)
180 assert('Float#nan?') do
181 assert_predicate(0.0/0.0, :nan?)
182 assert_not_predicate(0.0, :nan?)
183 assert_not_predicate(1.0/0.0, :nan?)
184 assert_not_predicate(-1.0/0.0, :nan?)
187 assert('Float#<<') do
189 assert_equal 46, 23.0 << 1
191 # Left Shift by a negative is Right Shift
192 assert_equal 23, 46.0 << -1
195 assert('Float#>>') do
197 assert_equal 23, 46.0 >> 1
199 # Right Shift by a negative is Left Shift
200 assert_equal 46, 23.0 >> -1
202 # Don't raise on large Right Shift
203 assert_equal 0, 23.0 >> 128
205 # Don't raise on large Right Shift
206 assert_equal(-1, -23.0 >> 128)
209 assert('Float#to_s') do
210 uses_float = 4e38.infinite? # enable MRB_USE_FLOAT?
212 assert_equal("Infinity", Float::INFINITY.to_s)
213 assert_equal("-Infinity", (-Float::INFINITY).to_s)
214 assert_equal("NaN", Float::NAN.to_s)
215 assert_equal("0", 0.0.to_s)
216 assert_equal("-0", -0.0.to_s)
217 assert_equal("-3.25", -3.25.to_s)
218 assert_equal("50", 50.0.to_s)
219 assert_equal("0.0125", 0.0125.to_s)
220 assert_equal("-0.0125", -0.0125.to_s)
221 assert_equal("1.0e-10", 0.0000000001.to_s)
222 assert_equal("-1.0e-10", -0.0000000001.to_s)
223 assert_equal("1.0e+20", 1e20.to_s)
224 assert_equal("-1.0e+20", -1e20.to_s)
225 assert_equal("1.0e+16", 10000000000000000.0.to_s)
226 assert_equal("-1.0e+16", -10000000000000000.0.to_s)
227 assert_equal("100000", 100000.0.to_s)
228 assert_equal("-100000", -100000.0.to_s)
230 assert_equal("1.0e+08", 100000000.0.to_s)
231 assert_equal("-1.0e+08", -100000000.0.to_s)
232 assert_equal("1.0e+07", 10000000.0.to_s)
233 assert_equal("-1.0e+07", -10000000.0.to_s)
235 assert_equal("1.0e+15", 1000000000000000.0.to_s)
236 assert_equal("-1.0e+15", -1000000000000000.0.to_s)
237 assert_equal("100000000000000", 100000000000000.0.to_s)
238 assert_equal("-100000000000000", -100000000000000.0.to_s)
242 assert('Float#eql?') do
243 assert_operator(5.0, :eql?, 5.0)
244 assert_not_operator(5.0, :eql?, 5)
245 assert_not_operator(5.0, :eql?, "5.0")
248 end # const_defined?(:Float)