Skip to content

Commit 833bd72

Browse files
committed
fix MX_E5M2, fix tests
1 parent 5d203fd commit 833bd72

File tree

4 files changed

+99
-118
lines changed

4 files changed

+99
-118
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "Microfloats"
22
uuid = "31c70f10-a750-4521-b13c-797315ae2933"
33
authors = ["Anton Oresten <[email protected]> and contributors"]
4-
version = "0.0.5"
4+
version = "0.0.6"
55

66
[deps]
77
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"

src/MX/MX.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ abstract type MX <: Variant end
22

33
const MX_Microfloat{S,E,M} = Microfloat{S,E,M,MX}
44

5-
const MX_E5M2 = MX_Microfloat{1,5,2}
5+
const MX_E5M2 = IEEEMicrofloat{1,5,2}
66
const MX_E4M3 = MX_Microfloat{1,4,3}
77
const MX_E3M2 = MX_Microfloat{1,3,2}
88
const MX_E2M3 = MX_Microfloat{1,2,3}
@@ -78,7 +78,7 @@ function create_base_shifttable(::Type{T}) where {T<:MX_Microfloat}
7878
shifttable = Vector{UInt8}(undef, 512)
7979

8080
e_shift_subnorm = n_mantissa_bits(Float32) - (n_mantissa_bits(T) - 1) + e_normal(T) - 1
81-
# MX uses the all-ones exponent as finite for data types (E5M2/E4M3/E3M2/E2M3/E2M1)
81+
# MX uses the all-ones exponent as finite for data types (E4M3/E3M2/E2M3/E2M1)
8282
e_overflow_mx = T <: MX_E8M0 ? Int(e_overflow(T)) : Int(e_overflow(T)) + 1
8383

8484
for i = 0:255

test/MX/MX_compliance.jl

Lines changed: 82 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -8,156 +8,146 @@
88
@testset "FP8" begin
99

1010
@testset "E4M3" begin
11-
E4M3 = Microfloat(1, 4, 3, MX)
11+
@test Microfloats.bias(MX_E4M3) == 7
1212

13-
@test Microfloats.bias(E4M3) == 7
14-
15-
@test isfinite(reinterpret(E4M3, 0b0_1111_000))
16-
@test isfinite(reinterpret(E4M3, 0b1_1111_000))
13+
@test isfinite(reinterpret(MX_E4M3, 0b0_1111_000))
14+
@test isfinite(reinterpret(MX_E4M3, 0b1_1111_000))
1715

1816
for i in 0b001:0b110
19-
@test isfinite(reinterpret(E4M3, 0b0_1111_000 | i))
20-
@test isfinite(reinterpret(E4M3, 0b1_1111_000 | i))
17+
@test isfinite(reinterpret(MX_E4M3, 0b0_1111_000 | i))
18+
@test isfinite(reinterpret(MX_E4M3, 0b1_1111_000 | i))
2119
end
2220

23-
@test isnan(reinterpret(E4M3, 0b0_1111_111))
24-
@test isnan(reinterpret(E4M3, 0b1_1111_111))
21+
@test isnan(reinterpret(MX_E4M3, 0b0_1111_111))
22+
@test isnan(reinterpret(MX_E4M3, 0b1_1111_111))
2523

26-
@test iszero(reinterpret(E4M3, 0b0_0000_000))
27-
@test iszero(reinterpret(E4M3, 0b1_0000_000))
24+
@test iszero(reinterpret(MX_E4M3, 0b0_0000_000))
25+
@test iszero(reinterpret(MX_E4M3, 0b1_0000_000))
2826

29-
@test reinterpret(E4M3, 0b0_1111_110) == 2^8 * 1.75
30-
@test reinterpret(E4M3, 0b1_1111_110) == -2^8 * 1.75
27+
@test reinterpret(MX_E4M3, 0b0_1111_110) == 2^8 * 1.75 == floatmax(MX_E4M3)
28+
@test reinterpret(MX_E4M3, 0b1_1111_110) == -2^8 * 1.75 == -floatmax(MX_E4M3)
3129

32-
@test reinterpret(E4M3, 0b0_0001_000) == 2^-6
33-
@test reinterpret(E4M3, 0b1_0001_000) == -2^-6
30+
@test reinterpret(MX_E4M3, 0b0_0001_000) == 2^-6 == floatmin(MX_E4M3)
31+
@test reinterpret(MX_E4M3, 0b1_0001_000) == -2^-6 == -floatmin(MX_E4M3)
3432

35-
@test reinterpret(E4M3, 0b0_0000_111) == 2^-6 * 0.875
36-
@test reinterpret(E4M3, 0b1_0000_111) == -2^-6 * 0.875
33+
@test reinterpret(MX_E4M3, 0b0_0000_111) == 2^-6 * 0.875 == prevfloat(floatmin(MX_E4M3))
34+
@test reinterpret(MX_E4M3, 0b1_0000_111) == -2^-6 * 0.875 == -prevfloat(floatmin(MX_E4M3))
3735

38-
@test reinterpret(E4M3, 0b0_0000_001) == 2^-9
39-
@test reinterpret(E4M3, 0b1_0000_001) == -2^-9
36+
@test reinterpret(MX_E4M3, 0b0_0000_001) == 2^-9 == nextfloat(zero(MX_E4M3))
37+
@test reinterpret(MX_E4M3, 0b1_0000_001) == -2^-9 == -nextfloat(zero(MX_E4M3))
4038
end
4139

4240
@testset "E5M2" begin
43-
E5M2 = Microfloat(1, 5, 2)
44-
45-
@test Microfloats.bias(E5M2) == 15
41+
@test Microfloats.bias(MX_E5M2) == 15
4642

47-
@test reinterpret(UInt8, E5M2(Inf)) == 0b0_11111_00
48-
@test reinterpret(UInt8, E5M2(-Inf)) == 0b1_11111_00
43+
@test reinterpret(UInt8, MX_E5M2(Inf)) == 0b0_11111_00
44+
@test reinterpret(UInt8, MX_E5M2(-Inf)) == 0b1_11111_00
4945

5046
for i in 0b01:0b11
51-
@test isnan(reinterpret(E5M2, 0b0_11111_00 | i))
52-
@test isnan(reinterpret(E5M2, 0b1_11111_00 | i))
47+
@test isnan(reinterpret(MX_E5M2, 0b0_11111_00 | i))
48+
@test isnan(reinterpret(MX_E5M2, 0b1_11111_00 | i))
5349
end
5450

55-
@test iszero(reinterpret(E5M2, 0b0_00000_00))
56-
@test iszero(reinterpret(E5M2, 0b1_00000_00))
51+
@test iszero(reinterpret(MX_E5M2, 0b0_00000_00))
52+
@test iszero(reinterpret(MX_E5M2, 0b1_00000_00))
5753

58-
@test reinterpret(E5M2, 0b0_11110_11) == 2^15 * 1.75
59-
@test reinterpret(E5M2, 0b1_11110_11) == -2^15 * 1.75
60-
@test nextfloat(reinterpret(E5M2, 0b0_11110_11)) == Inf
61-
@test prevfloat(reinterpret(E5M2, 0b1_11110_11)) == -Inf
54+
@test reinterpret(MX_E5M2, 0b0_11110_11) == 2^15 * 1.75 == floatmax(MX_E5M2)
55+
@test reinterpret(MX_E5M2, 0b1_11110_11) == -2^15 * 1.75 == -floatmax(MX_E5M2)
56+
@test nextfloat(reinterpret(MX_E5M2, 0b0_11110_11)) == Inf
57+
@test prevfloat(reinterpret(MX_E5M2, 0b1_11110_11)) == -Inf
6258

63-
@test reinterpret(E5M2, 0b0_00001_00) == 2^-14
64-
@test reinterpret(E5M2, 0b1_00001_00) == -2^-14
59+
@test reinterpret(MX_E5M2, 0b0_00001_00) == 2^-14 == floatmin(MX_E5M2)
60+
@test reinterpret(MX_E5M2, 0b1_00001_00) == -2^-14 == -floatmin(MX_E5M2)
6561

66-
@test reinterpret(E5M2, 0b0_00000_11) == 2^-14 * 0.75
67-
@test reinterpret(E5M2, 0b1_00000_11) == -2^-14 * 0.75
68-
@test reinterpret(E5M2, 0b0_00000_01) == 2^-16
69-
@test reinterpret(E5M2, 0b1_00000_01) == -2^-16
62+
@test reinterpret(MX_E5M2, 0b0_00000_11) == 2^-14 * 0.75 == prevfloat(floatmin(MX_E5M2))
63+
@test reinterpret(MX_E5M2, 0b1_00000_11) == -2^-14 * 0.75 == -prevfloat(floatmin(MX_E5M2))
64+
65+
@test reinterpret(MX_E5M2, 0b0_00000_01) == 2^-16 == nextfloat(zero(MX_E5M2))
66+
@test reinterpret(MX_E5M2, 0b1_00000_01) == -2^-16 == -nextfloat(zero(MX_E5M2))
7067
end
7168

7269
end
7370

7471
@testset "FP6" begin
7572

7673
@testset "E2M3" begin
77-
E2M3 = Microfloat(1, 2, 3, MX)
78-
79-
@test Microfloats.bias(E2M3) == 1
74+
@test Microfloats.bias(MX_E2M3) == 1
8075

81-
@test isfinite(reinterpret(E2M3, 0b0_11_000))
82-
@test isfinite(reinterpret(E2M3, 0b1_11_000))
76+
@test isfinite(reinterpret(MX_E2M3, 0b0_11_000))
77+
@test isfinite(reinterpret(MX_E2M3, 0b1_11_000))
8378

8479
for i in 0b001:0b111
85-
@test isfinite(reinterpret(E2M3, 0b0_11_000 | i << 2))
86-
@test isfinite(reinterpret(E2M3, 0b1_11_000 | i << 2))
80+
@test isfinite(reinterpret(MX_E2M3, 0b0_11_000 | i << 2))
81+
@test isfinite(reinterpret(MX_E2M3, 0b1_11_000 | i << 2))
8782
end
8883

89-
@test iszero(reinterpret(E2M3, 0b0_00_000))
90-
@test iszero(reinterpret(E2M3, 0b1_00_000))
84+
@test iszero(reinterpret(MX_E2M3, 0b0_00_000))
85+
@test iszero(reinterpret(MX_E2M3, 0b1_00_000))
9186

92-
@test reinterpret(E2M3, 0b0_11_111) == 2^2 * 1.875
93-
@test reinterpret(E2M3, 0b1_11_111) == -2^2 * 1.875
87+
@test reinterpret(MX_E2M3, 0b0_11_111) == 2^2 * 1.875 == floatmax(MX_E2M3)
88+
@test reinterpret(MX_E2M3, 0b1_11_111) == -2^2 * 1.875 == -floatmax(MX_E2M3)
9489

95-
@test reinterpret(E2M3, 0b0_01_000) == 2^0 * 1.0
96-
@test reinterpret(E2M3, 0b1_01_000) == -2^0 * 1.0
90+
@test reinterpret(MX_E2M3, 0b0_01_000) == 2^0 * 1.0 == floatmin(MX_E2M3)
91+
@test reinterpret(MX_E2M3, 0b1_01_000) == -2^0 * 1.0 == -floatmin(MX_E2M3)
9792

98-
@test reinterpret(E2M3, 0b0_00_111) == 2^0 * 0.875
99-
@test reinterpret(E2M3, 0b1_00_111) == -2^0 * 0.875
100-
101-
@test reinterpret(E2M3, 0b0_00_001) == 2^0 * 0.125
102-
@test reinterpret(E2M3, 0b1_00_001) == -2^0 * 0.125
93+
@test reinterpret(MX_E2M3, 0b0_00_111) == 2^0 * 0.875 == prevfloat(floatmin(MX_E2M3))
94+
@test reinterpret(MX_E2M3, 0b1_00_111) == -2^0 * 0.875 == -prevfloat(floatmin(MX_E2M3))
10395

96+
@test reinterpret(MX_E2M3, 0b0_00_001) == 2^0 * 0.125 == nextfloat(zero(MX_E2M3))
97+
@test reinterpret(MX_E2M3, 0b1_00_001) == -2^0 * 0.125 == -nextfloat(zero(MX_E2M3))
10498
end
10599

106100
@testset "E3M2" begin
107-
E3M2 = Microfloat(1, 3, 2, MX)
108-
109-
@test Microfloats.bias(E3M2) == 3
101+
@test Microfloats.bias(MX_E3M2) == 3
110102

111-
@test isfinite(reinterpret(E3M2, 0b0_111_00))
112-
@test isfinite(reinterpret(E3M2, 0b1_111_00))
103+
@test isfinite(reinterpret(MX_E3M2, 0b0_111_00))
104+
@test isfinite(reinterpret(MX_E3M2, 0b1_111_00))
113105

114106
for i in 0b01:0b11
115-
@test isfinite(reinterpret(E3M2, 0b0_111_00 | i << 2))
116-
@test isfinite(reinterpret(E3M2, 0b1_111_00 | i << 2))
107+
@test isfinite(reinterpret(MX_E3M2, 0b0_111_00 | i << 2))
108+
@test isfinite(reinterpret(MX_E3M2, 0b1_111_00 | i << 2))
117109
end
118110

119-
@test iszero(reinterpret(E3M2, 0b0_000_00))
120-
@test iszero(reinterpret(E3M2, 0b1_000_00))
111+
@test iszero(reinterpret(MX_E3M2, 0b0_000_00))
112+
@test iszero(reinterpret(MX_E3M2, 0b1_000_00))
121113

122-
@test reinterpret(E3M2, 0b0_111_11) == 2^4 * 1.75
123-
@test reinterpret(E3M2, 0b1_111_11) == -2^4 * 1.75
114+
@test reinterpret(MX_E3M2, 0b0_111_11) == 2^4 * 1.75 == floatmax(MX_E3M2)
115+
@test reinterpret(MX_E3M2, 0b1_111_11) == -2^4 * 1.75 == -floatmax(MX_E3M2)
124116

125-
@test reinterpret(E3M2, 0b0_001_00) == 2^-2 * 1.0
126-
@test reinterpret(E3M2, 0b1_001_00) == -2^-2 * 1.0
117+
@test reinterpret(MX_E3M2, 0b0_001_00) == 2^-2 * 1.0 == floatmin(MX_E3M2)
118+
@test reinterpret(MX_E3M2, 0b1_001_00) == -2^-2 * 1.0 == -floatmin(MX_E3M2)
127119

128-
@test reinterpret(E3M2, 0b0_000_11) == 2^-2 * 0.75
129-
@test reinterpret(E3M2, 0b1_000_11) == -2^-2 * 0.75
120+
@test reinterpret(MX_E3M2, 0b0_000_11) == 2^-2 * 0.75 == prevfloat(floatmin(MX_E3M2))
121+
@test reinterpret(MX_E3M2, 0b1_000_11) == -2^-2 * 0.75 == -prevfloat(floatmin(MX_E3M2))
130122

131-
@test reinterpret(E3M2, 0b0_000_01) == 2^-2 * 0.25
132-
@test reinterpret(E3M2, 0b1_000_01) == -2^-2 * 0.25
123+
@test reinterpret(MX_E3M2, 0b0_000_01) == 2^-2 * 0.25 == nextfloat(zero(MX_E3M2))
124+
@test reinterpret(MX_E3M2, 0b1_000_01) == -2^-2 * 0.25 == -nextfloat(zero(MX_E3M2))
133125
end
134126

135127
end
136128

137129
@testset "FP4" begin
138130

139131
@testset "E2M1" begin
140-
E2M1 = Microfloat(1, 2, 1, MX)
132+
@test Microfloats.bias(MX_E2M1) == 1
141133

142-
@test Microfloats.bias(E2M1) == 1
134+
@test isfinite(reinterpret(MX_E2M1, 0b0_11_0))
135+
@test isfinite(reinterpret(MX_E2M1, 0b1_11_0))
143136

144-
@test isfinite(reinterpret(E2M1, 0b0_11_0))
145-
@test isfinite(reinterpret(E2M1, 0b1_11_0))
137+
@test isfinite(reinterpret(MX_E2M1, 0b0_11_1))
138+
@test isfinite(reinterpret(MX_E2M1, 0b1_11_1))
146139

147-
@test isfinite(reinterpret(E2M1, 0b0_11_1))
148-
@test isfinite(reinterpret(E2M1, 0b1_11_1))
140+
@test iszero(reinterpret(MX_E2M1, 0b0_00_0))
141+
@test iszero(reinterpret(MX_E2M1, 0b1_00_0))
149142

150-
@test iszero(reinterpret(E2M1, 0b0_00_0))
151-
@test iszero(reinterpret(E2M1, 0b1_00_0))
143+
@test reinterpret(MX_E2M1, 0b0_11_1) == 2^2 * 1.5 == floatmax(MX_E2M1)
144+
@test reinterpret(MX_E2M1, 0b1_11_1) == -2^2 * 1.5 == -floatmax(MX_E2M1)
152145

153-
@test reinterpret(E2M1, 0b0_11_1) == 2^2 * 1.5
154-
@test reinterpret(E2M1, 0b1_11_1) == -2^2 * 1.5
146+
@test reinterpret(MX_E2M1, 0b0_01_0) == 2^0 * 1.0 == floatmin(MX_E2M1)
147+
@test reinterpret(MX_E2M1, 0b1_01_0) == -2^0 * 1.0 == -floatmin(MX_E2M1)
155148

156-
@test reinterpret(E2M1, 0b0_01_0) == 2^0 * 1.0
157-
@test reinterpret(E2M1, 0b1_01_0) == -2^0 * 1.0
158-
159-
@test reinterpret(E2M1, 0b0_00_1) == 2^0 * 0.5
160-
@test reinterpret(E2M1, 0b1_00_1) == -2^0 * 0.5
149+
@test reinterpret(MX_E2M1, 0b0_00_1) == 2^0 * 0.5 == nextfloat(zero(MX_E2M1))
150+
@test reinterpret(MX_E2M1, 0b1_00_1) == -2^0 * 0.5 == -nextfloat(zero(MX_E2M1))
161151
end
162152

163153
end
@@ -168,17 +158,15 @@
168158

169159
# arithmetic not yet supported for unsigned microfloats
170160
@testset "E8M0" begin
171-
E8M0 = Microfloat(0, 8, 0, MX)
172-
173-
@test Microfloats.bias(E8M0) == 127
161+
@test Microfloats.bias(MX_E8M0) == 127
174162

175163
#@test floatmax(E8M0) == floatmax(Float32) / 2
176164

177-
@test !isfinite(reinterpret(E8M0, 0b11111111))
165+
@test !isfinite(reinterpret(MX_E8M0, 0b11111111))
178166

179-
@test isnan(reinterpret(E8M0, 0b11111111))
167+
@test isnan(reinterpret(MX_E8M0, 0b11111111))
180168

181-
@test iszero(reinterpret(E8M0, 0b00000000))
169+
@test iszero(reinterpret(MX_E8M0, 0b00000000))
182170
end
183171

184172
end

0 commit comments

Comments
 (0)