1/**
2 * Copyright (c) Glow Contributors. See CONTRIBUTORS file.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17// This file tests the basic functionality of the float16 type.
18// This is by no mean a test to show the IEEE 754 compliance!
19
20#include "glow/Support/Float16.h"
21
22#include "gtest/gtest.h"
23
24using namespace glow;
25
26TEST(Float16, add) {
27 float16 a = 2.0;
28 float16 b = 1.0;
29 EXPECT_EQ(a + b, float16(float(a) + float(b)));
30}
31
32TEST(Float16, addEqual) {
33 float16 a = 46.2;
34 float16 b = 13.66;
35 float16 aPlusB = a + b;
36 a += b;
37 EXPECT_EQ(a, aPlusB);
38}
39
40TEST(Float16, sub) {
41 float16 a = 2.0;
42 float16 b = 0.5;
43 EXPECT_EQ(a - b, float16(float(a) - float(b)));
44}
45
46TEST(Float16, minusEqual) {
47 float16 a = -146.2;
48 float16 b = 131.66;
49 float16 aMinusB = a - b;
50 a -= b;
51 EXPECT_EQ(a, aMinusB);
52}
53
54TEST(Float16, mul) {
55 float16 a = 3.5;
56 float16 b = 3.0;
57 EXPECT_EQ(a * b, float16(float(a) * float(b)));
58}
59
60TEST(Float16, mulEqual) {
61 float16 a = 3.5;
62 float16 b = 3.0;
63 float16 aMulB = a * b;
64 a *= b;
65 EXPECT_EQ(a, aMulB);
66}
67
68TEST(Float16, div) {
69 float16 a = 16.5;
70 float16 b = -3.0;
71 EXPECT_EQ(a / b, float16(float(a) / float(b)));
72}
73
74TEST(Float16, divEqual) {
75 float16 a = 16.5;
76 float16 b = -3.0;
77 float16 aDivB = a / b;
78 a /= b;
79 EXPECT_EQ(a, aDivB);
80}
81
82TEST(Float16, gt) {
83 float16 a = 13.25;
84 float16 b = 3.56;
85 EXPECT_EQ(a > b, float(a) > float(b));
86 EXPECT_TRUE(a > b);
87}
88
89TEST(Float16, lt) {
90 float16 a = 123.75;
91 float16 b = -12.6;
92 EXPECT_EQ(a < b, float(a) < float(b));
93 EXPECT_FALSE(a < b);
94}
95
96TEST(Float16, eq) {
97 float16 a = -483.455;
98 float16 b = 453.0;
99 EXPECT_EQ(a == b, float(a) == float(b));
100 EXPECT_FALSE(a == b);
101 EXPECT_TRUE(a == a);
102}
103
104TEST(Float16, ge) {
105 float16 a = -31.455;
106 float16 b = 4543.4;
107 EXPECT_EQ(a >= b, float(a) >= float(b));
108 EXPECT_FALSE(a >= b);
109}
110
111TEST(Float16, le) {
112 float16 a = 214.1;
113 float16 b = 4543.4;
114 EXPECT_EQ(a <= b, float(a) <= float(b));
115 EXPECT_TRUE(a <= b);
116}
117
118template <typename T> static void testConvertTo() {
119 float16 a = 19.3;
120 T b = static_cast<T>(19.3);
121 EXPECT_NEAR(T(a), b, 1);
122}
123
124#define TEST_CONVERT_TO(DEST_TYPE) \
125 TEST(Float16, CONVERT_TO_##DEST_TYPE) { testConvertTo<DEST_TYPE>(); }
126TEST_CONVERT_TO(float)
127TEST_CONVERT_TO(double)
128TEST_CONVERT_TO(int32_t)
129TEST_CONVERT_TO(int64_t)
130
131#undef TEST_CONVERT_TO
132