@@ -9,22 +9,21 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
9
9
See the License for the specific language governing permissions and
10
10
limitations under the License. */
11
11
12
- #include < gtest/gtest.h>
13
12
#include " paddle/math/float16.h"
14
13
14
+ #include < gtest/gtest.h>
15
+
15
16
namespace paddle {
16
17
17
18
TEST (float16, conversion_cpu) {
18
- LOG (INFO) << " cpu test started!" ;
19
-
20
- // Conversion to and from Eigen::half
21
- EXPECT_EQ (float16 (Eigen::half (float16 (1 .0f ))).x , 0x3c00 );
22
- EXPECT_EQ (float16 (Eigen::half (float16 (0 .5f ))).x , 0x3800 );
23
- EXPECT_EQ (float16 (Eigen::half (float16 (0 .33333f ))).x , 0x3555 );
24
- EXPECT_EQ (float16 (Eigen::half (float16 (0 .0f ))).x , 0x0000 );
25
- EXPECT_EQ (float16 (Eigen::half (float16 (-0 .0f ))).x , 0x8000 );
26
- EXPECT_EQ (float16 (Eigen::half (float16 (65504 .0f ))).x , 0x7bff );
27
- EXPECT_EQ (float16 (Eigen::half (float16 (65536 .0f ))).x , 0x7c00 );
19
+ // Explicit conversion from Eigen::half
20
+ EXPECT_EQ (float16 (Eigen::half (1 .0f )).x , 0x3c00 );
21
+ EXPECT_EQ (float16 (Eigen::half (0 .5f )).x , 0x3800 );
22
+ EXPECT_EQ (float16 (Eigen::half (0 .33333f )).x , 0x3555 );
23
+ EXPECT_EQ (float16 (Eigen::half (0 .0f )).x , 0x0000 );
24
+ EXPECT_EQ (float16 (Eigen::half (-0 .0f )).x , 0x8000 );
25
+ EXPECT_EQ (float16 (Eigen::half (65504 .0f )).x , 0x7bff );
26
+ EXPECT_EQ (float16 (Eigen::half (65536 .0f )).x , 0x7c00 );
28
27
29
28
// Conversion from float
30
29
EXPECT_EQ (float16 (1 .0f ).x , 0x3c00 );
@@ -36,14 +35,91 @@ TEST(float16, conversion_cpu) {
36
35
EXPECT_EQ (float16 (65536 .0f ).x , 0x7c00 );
37
36
38
37
// Conversion from double
38
+ EXPECT_EQ (float16 (1.0 ).x , 0x3c00 );
39
+ EXPECT_EQ (float16 (0.5 ).x , 0x3800 );
40
+ EXPECT_EQ (float16 (0.33333 ).x , 0x3555 );
41
+ EXPECT_EQ (float16 (0.0 ).x , 0x0000 );
42
+ EXPECT_EQ (float16 (-0.0 ).x , 0x8000 );
43
+ EXPECT_EQ (float16 (65504.0 ).x , 0x7bff );
44
+ EXPECT_EQ (float16 (65536.0 ).x , 0x7c00 );
39
45
40
46
// Conversion from int
47
+ EXPECT_EQ (float16 (-1 ).x , 0xbc00 );
48
+ EXPECT_EQ (float16 (0 ).x , 0x0000 );
49
+ EXPECT_EQ (float16 (1 ).x , 0x3c00 );
50
+ EXPECT_EQ (float16 (2 ).x , 0x4000 );
51
+ EXPECT_EQ (float16 (3 ).x , 0x4200 );
41
52
42
53
// Conversion from bool
54
+ EXPECT_EQ (float16 (true ).x , 0x3c00 );
55
+ EXPECT_EQ (float16 (false ).x , 0x0000 );
56
+
57
+ // Implicit conversion to and from Eigen::half
58
+ Eigen::half tmp = float16 (1 .0f );
59
+ float16 v_conv = tmp;
60
+ EXPECT_EQ (tmp.x , 0x3c00 );
61
+ EXPECT_EQ (v_conv.x , 0x3c00 );
62
+
63
+ // Default constructor
64
+ float16 v_def;
65
+ EXPECT_EQ (v_def.x , 0x0000 );
66
+
67
+ // Assignment operator
68
+ float16 v_assign;
69
+ v_assign = v_def;
70
+ EXPECT_EQ (v_assign.x , 0x0000 );
71
+ v_assign = Eigen::half (1 .0f );
72
+ EXPECT_EQ (v_assign.x , 0x3c00 );
73
+ v_assign = 0 .5f ;
74
+ EXPECT_EQ (v_assign.x , 0x3800 );
75
+ v_assign = 0.33333 ;
76
+ EXPECT_EQ (v_assign.x , 0x3555 );
77
+ v_assign = -1 ;
78
+ EXPECT_EQ (v_assign.x , 0xbc00 );
79
+ v_assign = true ;
80
+ EXPECT_EQ (v_assign.x , 0x3c00 );
81
+
82
+ // Conversion operator
83
+ EXPECT_EQ (Eigen::half (float16 (1 .0f )).x , 0x3c00 );
84
+ EXPECT_EQ (float (float16 (0 .5f )), 0 .5f );
85
+ EXPECT_NEAR (double (float16 (0.33333 )), 0.33333 , 0.0001 );
86
+ EXPECT_EQ (int (float16 (-1 )), -1 );
87
+ EXPECT_EQ (bool (float16 (true )), true );
43
88
}
44
89
45
- TEST (float16, arithmetic_cpu) { EXPECT_EQ (float (float16 (2 ) + float16 (2 )), 4 ); }
90
+ TEST (float16, arithmetic_cpu) {
91
+ EXPECT_EQ (float (float16 (1 ) + float16 (1 )), 2 );
92
+ EXPECT_EQ (float (float16 (5 ) + float16 (-5 )), 0 );
93
+ EXPECT_NEAR (float (float16 (0 .33333f ) + float16 (0 .66667f )), 1 .0f , 0.001 );
94
+ EXPECT_EQ (float (float16 (3 ) - float16 (5 )), -2 );
95
+ EXPECT_NEAR (float (float16 (0 .66667f ) - float16 (0 .33333f )), 0 .33334f , 0.001 );
96
+ EXPECT_NEAR (float (float16 (3 .3f ) * float16 (2 .0f )), 6 .6f , 0.01 );
97
+ EXPECT_NEAR (float (float16 (-2 .1f ) * float16 (-3 .0f )), 6 .3f , 0.01 );
98
+ EXPECT_NEAR (float (float16 (2 .0f ) / float16 (3 .0f )), 0 .66667f , 0.001 );
99
+ EXPECT_EQ (float (float16 (1 .0f ) / float16 (2 .0f )), 0 .5f );
100
+ EXPECT_EQ (float (-float16 (512 .0f )), -512 .0f );
101
+ EXPECT_EQ (float (-float16 (-512 .0f )), 512 .0f );
102
+ }
46
103
47
- TEST (float16, comparison_cpu) { EXPECT_TRUE (float16 (1 .0f ) > float16 (0 .5f )); }
104
+ TEST (float16, comparison_cpu) {
105
+ EXPECT_TRUE (float16 (1 .0f ) == float16 (1 .0f ));
106
+ EXPECT_FALSE (float16 (-1 .0f ) == float16 (-0 .5f ));
107
+ EXPECT_TRUE (float16 (1 .0f ) != float16 (0 .5f ));
108
+ EXPECT_FALSE (float16 (-1 .0f ) != float16 (-1 .0f ));
109
+ EXPECT_TRUE (float16 (1 .0f ) < float16 (2 .0f ));
110
+ EXPECT_FALSE (float16 (-1 .0f ) < float16 (-1 .0f ));
111
+ EXPECT_TRUE (float16 (1 .0f ) <= float16 (1 .0f ));
112
+ EXPECT_TRUE (float16 (2 .0f ) > float16 (1 .0f ));
113
+ EXPECT_FALSE (float16 (-2 .0f ) > float16 (-2 .0f ));
114
+ EXPECT_TRUE (float16 (2 .0f ) >= float16 (2 .0f ));
115
+
116
+ EXPECT_TRUE (float16 (0 .0f ) == float16 (-0 .0f ));
117
+ EXPECT_TRUE (float16 (0 .0f ) <= float16 (-0 .0f ));
118
+ EXPECT_TRUE (float16 (0 .0f ) >= float16 (-0 .0f ));
119
+ EXPECT_FALSE (float16 (0 .0f ) < float16 (-0 .0f ));
120
+ EXPECT_FALSE (float16 (-0 .0f ) < float16 (0 .0f ));
121
+ EXPECT_FALSE (float16 (0 .0f ) > float16 (-0 .0f ));
122
+ EXPECT_FALSE (float16 (-0 .0f ) > float16 (0 .0f ));
123
+ }
48
124
49
125
} // namespace paddle
0 commit comments