1
- using FixedPointNumbers, Statistics, Test
2
- using FixedPointNumbers: bitwidth
1
+ include (" common.jl" )
2
+
3
+ function symbol_to_inttype (:: Type{Fixed} , s:: Symbol )
4
+ d = Dict (:i8 => Int8, :i16 => Int16, :i32 => Int32, :i64 => Int64, :i128 => Int128)
5
+ d[s]
6
+ end
3
7
4
8
function test_op (fun:: F , :: Type{T} , fx, fy, fxf, fyf, tol) where {F,T}
5
9
# Make sure that the result is representable
@@ -8,9 +12,9 @@ function test_op(fun::F, ::Type{T}, fx, fy, fxf, fyf, tol) where {F,T}
8
12
@assert abs (convert (Float64, fun (fx, fy)) - fun (fxf, fyf)) <= tol
9
13
end
10
14
11
- function test_fixed (:: Type{T} , f ) where {T}
15
+ function test_fixed (:: Type{T} ) where {T}
12
16
values = [- 10 : 0.01 : 10 ; - 180 : .01 : - 160 ; 160 : .01 : 180 ]
13
- tol = 2.0 ^- f
17
+ tol = Float64 ( eps (T))
14
18
for x in values
15
19
# Ignore values outside the representable range
16
20
# typemin <, otherwise for -(-0.5) > typemax
@@ -36,7 +40,7 @@ function test_fixed(::Type{T}, f) where {T}
36
40
fyf = convert (Float64, fy)
37
41
38
42
@assert fx== fy || x!= y
39
- @assert fx< fy || x >= y
43
+ @assert fx< fy || (x + tol) >= y
40
44
@assert fx<= fy || x> y
41
45
42
46
test_op (+ , T, fx, fy, fxf, fyf, tol)
@@ -50,10 +54,8 @@ function test_fixed(::Type{T}, f) where {T}
50
54
end
51
55
52
56
@testset " test_fixed" begin
53
- for (TI, f) in [(Int8, 7 ), (Int16, 8 ), (Int16, 10 ), (Int32, 16 )]
54
- T = Fixed{TI,f}
55
- # println(" Testing $T")
56
- test_fixed (T, f)
57
+ for F in target (Fixed, :i8 , :i16 , :i32 ; ex = :thin )
58
+ test_fixed (F)
57
59
end
58
60
end
59
61
93
95
end
94
96
95
97
@testset " limits and identities" begin
96
- # TODO : add tests
97
-
98
- # issue #79
99
- @test floatmin (Q11f4) == Q11f4 (0.06 )
98
+ @testset " $F " for F in target (Fixed)
99
+ T, f = rawtype (F), nbitsfrac (F)
100
+ @test zero (F) == 0
101
+ f < bitwidth (T) - 1 && @test one (F) == 1
102
+ f < bitwidth (T) - 1 && @test one (F) * oneunit (F) == oneunit (F)
103
+ @test typemin (F) == typemin (T) >> f
104
+ @test typemax (F) == typemax (T)// big " 2" ^ f
105
+ @test floatmin (F) === eps (F) == 2.0 ^- f # issue #79
106
+ @test floatmax (F) === typemax (F)
107
+ @test eps (zero (F)) === eps (typemax (F))
108
+ @test sizeof (F) == sizeof (T)
109
+ end
100
110
end
101
111
102
112
@testset " inexactness" begin
@@ -182,11 +192,15 @@ end
182
192
@test big (0.75 Q3f4):: BigFloat == big " 0.75"
183
193
end
184
194
185
- @testset " float() " begin
195
+ @testset " float/floattype " begin
186
196
@test float (0.75 Q3f4) === 0.75f0
187
197
@test float (0.75 Q19f12) === 0.75
188
198
@test float (0.75 Q7f24) === 0.75
189
199
@test float (0.75 Q10f53):: BigFloat == big " 0.75"
200
+
201
+ @testset " floattype($F )" for F in target (Fixed, :i8 , :i16 , :i32 , :i64 ; ex = :heavy )
202
+ @test typemax (F) <= maxintfloat (floattype (F))
203
+ end
190
204
end
191
205
192
206
@testset " conversions to float" begin
@@ -195,49 +209,40 @@ end
195
209
end
196
210
197
211
for Tf in (Float16, Float32, Float64)
198
- @testset " $Tf (::Fixed{$T })" for T in (Int8, Int16)
199
- @testset " $Tf (::Fixed{$T ,$f })" for f = 0 : bitwidth (T)- 1
200
- F = Fixed{T,f}
201
- float_err = 0.0
202
- for i = typemin (T): typemax (T)
203
- f_expected = Tf (i * BigFloat (2 )^- f)
204
- f_actual = Tf (reinterpret (F, i))
205
- float_err += abs (f_actual - f_expected)
206
- end
207
- @test float_err == 0.0
212
+ @testset " $Tf (::$F )" for F in target (Fixed, :i8 , :i16 )
213
+ T, f = rawtype (F), nbitsfrac (F)
214
+ float_err = 0.0
215
+ for i = typemin (T): typemax (T)
216
+ f_expected = Tf (i * BigFloat (2 )^- f)
217
+ f_actual = Tf (reinterpret (F, i))
218
+ float_err += abs (f_actual - f_expected)
208
219
end
220
+ @test float_err == 0.0
209
221
end
210
- @testset " $Tf (::Fixed{$T })" for T in (Int32, Int64, Int128)
211
- @testset " $Tf (::Fixed{$T ,$f })" for f = 0 : bitwidth (T)- 1
212
- F = Fixed{T,f}
213
- error_count = 0
214
- for i in vcat (typemin (T): (typemin (T)+ 0xFF ),
215
- - T (0xFF ): T (0xFF ),
216
- (typemax (T)- 0xFF ): typemax (T))
217
- f_expected = Tf (i * BigFloat (2 )^- f)
218
- isinf (f_expected) && break # for Float16() and Float32()
219
- f_actual = Tf (reinterpret (F, i))
220
- f_actual == f_expected && continue
221
- error_count += 1
222
- end
223
- @test error_count == 0
222
+ @testset " $Tf (::$F )" for F in target (Fixed, :i32 , :i64 , :i128 )
223
+ T, f = rawtype (F), nbitsfrac (F)
224
+ error_count = 0
225
+ for i in vcat (typemin (T): (typemin (T)+ 0xFF ),
226
+ - T (0xFF ): T (0xFF ),
227
+ (typemax (T)- 0xFF ): typemax (T))
228
+ f_expected = Tf (i * BigFloat (2 )^- f)
229
+ isinf (f_expected) && break # for Float16() and Float32()
230
+ f_actual = Tf (reinterpret (F, i))
231
+ f_actual == f_expected && continue
232
+ error_count += 1
224
233
end
234
+ @test error_count == 0
225
235
end
226
236
end
227
237
end
228
238
229
239
@testset " fractional fixed-point numbers" begin
230
240
# test all-fractional fixed-point numbers (issue #104)
231
- for (T, f) in ((Int8, 7 ),
232
- (Int16, 15 ),
233
- (Int32, 31 ),
234
- (Int64, 63 ))
235
- tmax = typemax (Fixed{T, f})
236
- @test tmax == BigInt (typemax (T)) / BigInt (2 )^ f
237
- tol = (tmax + BigFloat (1.0 )) / bitwidth (T)
238
- for x in range (- 1 , stop= BigFloat (tmax)- tol, length= 50 )
239
- @test abs (Fixed {T, f} (x) - x) <= tol
240
- end
241
+ for F in (Q0f7, Q0f15, Q0f31, Q0f63)
242
+ tmax = typemax (F)
243
+ tol = (tmax + BigFloat (1.0 )) / bitwidth (F)
244
+ r = range (- 1 , stop= BigFloat (tmax)- tol, length= 50 )
245
+ @test all (x -> abs (F (x) - x) <= tol, r)
241
246
end
242
247
end
243
248
@@ -258,15 +263,15 @@ end
258
263
end
259
264
260
265
@testset " rounding" begin
261
- for T in (Int8, Int16, Int32, Int64)
266
+ for sym in (:i8 , :i16 , :i32 , :i64 )
267
+ T = symbol_to_inttype (Fixed, sym)
262
268
rs = vcat ([ oneunit (T) << b - oneunit (T) for b = 0 : bitwidth (T)- 1 ],
263
269
[ oneunit (T) << b for b = 1 : bitwidth (T)- 2 ],
264
270
[ oneunit (T) << b + oneunit (T) for b = 2 : bitwidth (T)- 2 ],
265
271
[- oneunit (T) << b - oneunit (T) for b = 2 : bitwidth (T)- 2 ],
266
272
[- oneunit (T) << b for b = 1 : bitwidth (T)- 1 ],
267
273
[- oneunit (T) << b + oneunit (T) for b = 1 : bitwidth (T)- 1 ])
268
- @testset " rounding Fixed{$T ,$f }" for f = 0 : bitwidth (T)- 1
269
- F = Fixed{T,f}
274
+ @testset " rounding $F " for F in target (Fixed, sym)
270
275
xs = (reinterpret (F, r) for r in rs)
271
276
@test all (x -> trunc (x) == trunc (float (x)), xs)
272
277
@test all (x -> floor (float (x)) < typemin (F) || floor (x) == floor (float (x)), xs)
@@ -308,11 +313,11 @@ end
308
313
end
309
314
310
315
@testset " approx" begin
311
- @testset " approx $T " for T in [ Fixed{Int8, 7 }, Fixed{Int16, 8 }, Fixed{Int16, 10 }]
312
- xs = typemin (T ): eps (T ): typemax (T )- eps (T )
313
- @test all (x -> x ≈ x + eps (T ), xs)
314
- @test all (x -> x + eps (T ) ≈ x, xs)
315
- @test ! any (x -> x - eps (T ) ≈ x + eps (T ), xs)
316
+ @testset " approx $F " for F in target ( Fixed, :i8 , :i16 ; ex = :light )
317
+ xs = typemin (F ): eps (F ): typemax (F )- eps (F )
318
+ @test all (x -> x ≈ x + eps (F ), xs)
319
+ @test all (x -> x + eps (F ) ≈ x, xs)
320
+ @test ! any (x -> x - eps (F ) ≈ x + eps (F ), xs)
316
321
end
317
322
end
318
323
@@ -357,22 +362,16 @@ end
357
362
@test ! isinf (1 Q7f8)
358
363
359
364
@testset " isinteger" begin
360
- for T in (Int8, Int16)
361
- @testset " isinteger(::Fixed{$T ,$f })" for f = 0 : bitwidth (T)- 1
362
- F = Fixed{T,f}
363
- xs = typemin (F): eps (F): typemax (F)
364
- @test all (x -> isinteger (x) == isinteger (float (x)), xs)
365
- end
365
+ @testset " isinteger(::$F )" for F in target (Fixed, :i8 , :i16 )
366
+ xs = typemin (F): eps (F): typemax (F)
367
+ @test all (x -> isinteger (x) == isinteger (float (x)), xs)
366
368
end
367
- for T in (Int32, Int64)
368
- @testset " isinteger(::Fixed{$T ,$f })" for f = 0 : bitwidth (T)- 1
369
- F = Fixed{T,f}
370
- fzero, fmax, fmin = zero (F), typemax (F), typemin (F)
371
- if f == 0
372
- @test isinteger (fzero) & isinteger (fmax) & isinteger (fmin)
373
- else
374
- @test isinteger (fzero) & ! isinteger (fmax) & isinteger (fmin)
375
- end
369
+ @testset " isinteger(::$F )" for F in target (Fixed, :i32 , :i64 , :i128 )
370
+ fzero, fmax, fmin = zero (F), typemax (F), typemin (F)
371
+ if nbitsfrac (F) == 0
372
+ @test isinteger (fzero) & isinteger (fmax) & isinteger (fmin)
373
+ else
374
+ @test isinteger (fzero) & ! isinteger (fmax) & isinteger (fmin)
376
375
end
377
376
end
378
377
@testset " isinteger(::Fixed{Int8,8})" begin # TODO : remove this testset
@@ -436,10 +435,10 @@ end
436
435
end
437
436
438
437
@testset " rand" begin
439
- for F in (Fixed{Int8, 7 }, Fixed{Int16, 8 }, Fixed{Int16, 10 }, Fixed{Int32, 16 } )
438
+ @testset " rand(:: $F ) " for F in target (Fixed; ex = :thin )
440
439
@test isa (rand (F), F)
441
440
a = rand (F, (3 , 5 ))
442
- @test ndims (a) == 2 && eltype (a) == F
441
+ @test ndims (a) == 2 && eltype (a) === F
443
442
@test size (a) == (3 ,5 )
444
443
end
445
444
end
0 commit comments