@@ -19,6 +19,7 @@ limitations under the License.
1919#include < cstdint>
2020#include < limits>
2121
22+ #include < gtest/gtest.h>
2223#include " absl/base/casts.h"
2324#include " absl/numeric/bits.h"
2425#include " xla/bit_cast.h"
@@ -111,21 +112,74 @@ INSTANTIATE_TEST_SUITE_P(DoublePrecisionInputs, FixedValueTest,
111112 0x1 .fffffffffffffp-127 ,
112113 0x1 .aaaaaaaaaaaaap-127 ));
113114
114- // Test F8E4M3 floating-point types (F8E4M3FN)
115+ // Test F8E4M3 floating-point types (F8E4M3, F8E4M3FN)
115116template <typename T>
116117class FP8E4M3DistanceTest : public ::testing::Test {};
117118
118- using F8E4M3Types = ::testing::Types<tsl::float8_e4m3fn>;
119+ using F8E4M3Types = ::testing::Types<tsl::float8_e4m3, tsl:: float8_e4m3fn>;
119120TYPED_TEST_SUITE (FP8E4M3DistanceTest, F8E4M3Types);
120121
122+ TEST (FPDistanceTest, F8E3M4Distance) {
123+ // a & b are equal
124+ EXPECT_EQ (CalculateDistanceInFloats<tsl::float8_e3m4>(tsl::float8_e3m4 (8.0 ),
125+ tsl::float8_e3m4 (8.0 )),
126+ 0 );
127+
128+ // a & b have the same exponents
129+ EXPECT_EQ (CalculateDistanceInFloats<tsl::float8_e3m4>(tsl::float8_e3m4 (8.0 ),
130+ tsl::float8_e3m4 (15.5 )),
131+ 15 );
132+
133+ // a & b have different exponents
134+ EXPECT_EQ (CalculateDistanceInFloats<tsl::float8_e3m4>(tsl::float8_e3m4 (8.0 ),
135+ tsl::float8_e3m4 (6 )),
136+ 8 );
137+
138+ // 1 from 0 in the positive direction
139+ EXPECT_EQ (CalculateDistanceInFloats<tsl::float8_e3m4>(
140+ std::numeric_limits<tsl::float8_e3m4>::denorm_min (),
141+ tsl::float8_e3m4 (0 )),
142+ 1 );
143+
144+ // 1 from 0 in the negative direction
145+ EXPECT_EQ (CalculateDistanceInFloats<tsl::float8_e3m4>(
146+ -std::numeric_limits<tsl::float8_e3m4>::denorm_min (),
147+ tsl::float8_e3m4 (0 )),
148+ 1 );
149+
150+ // a & b have different signs
151+ EXPECT_EQ (CalculateDistanceInFloats<tsl::float8_e3m4>(
152+ -std::numeric_limits<tsl::float8_e3m4>::denorm_min (),
153+ std::numeric_limits<tsl::float8_e3m4>::denorm_min ()),
154+ 2 );
155+
156+ // 1 non denorm from 0 in the positive direction
157+ EXPECT_EQ (
158+ CalculateDistanceInFloats<tsl::float8_e3m4>(
159+ std::numeric_limits<tsl::float8_e3m4>::min (), tsl::float8_e3m4 (0 )),
160+ 16 );
161+
162+ // 1 non denorm from 0 in the negative direction
163+ EXPECT_EQ (
164+ CalculateDistanceInFloats<tsl::float8_e3m4>(
165+ -std::numeric_limits<tsl::float8_e3m4>::min (), tsl::float8_e3m4 (0 )),
166+ 16 );
167+
168+ // a & b have different signs
169+ EXPECT_EQ (CalculateDistanceInFloats<tsl::float8_e3m4>(
170+ -std::numeric_limits<tsl::float8_e3m4>::min (),
171+ std::numeric_limits<tsl::float8_e3m4>::min ()),
172+ 32 );
173+ }
174+
121175TYPED_TEST (FP8E4M3DistanceTest, F8E4M3Distance) {
122176 // a & b are equal, distance should be 0
123177 EXPECT_EQ (
124178 CalculateDistanceInFloats<TypeParam>(TypeParam (8.0 ), TypeParam (8.0 )), 0 );
125179
126180 // a & b have the same exponents
127- EXPECT_EQ (CalculateDistanceInFloats<TypeParam>( TypeParam ( 8.0 ), TypeParam ( 13 )),
128- 5 );
181+ EXPECT_EQ (
182+ CalculateDistanceInFloats<TypeParam>( TypeParam ( 8.0 ), TypeParam ( 15.0 )), 7 );
129183
130184 // a & b have different exponents
131185 EXPECT_EQ (
0 commit comments