source: mainline/uspace/lib/c/test/ieee_double.c@ cb7be8f

Last change on this file since cb7be8f was d7f7a4a, checked in by Jiří Zárevúcky <zarevucky.jiri@…>, 3 years ago

Replace some license headers with SPDX identifier

Headers are replaced using tools/transorm-copyright.sh only
when it can be matched verbatim with the license header used
throughout most of the codebase.

  • Property mode set to 100644
File size: 7.8 KB
Line 
1/*
2 * SPDX-FileCopyrightText: 2019 Matthieu Riolo
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include <pcut/pcut.h>
8#include <ieee_double.h>
9
10union {
11 uint64_t integer;
12 double floating;
13} ieee_double_bits;
14
15const int EXP_BIAS = 1023;
16const int EXP_BIAS_UNDERFLOWED = 1075;
17const int SIGN_SHIFT = 52;
18const uint64_t HIDDEN_BIT = 1ULL << SIGN_SHIFT;
19
20PCUT_INIT;
21
22PCUT_TEST_SUITE(ieee_double);
23
24PCUT_TEST(extract_ieee_sizeof_double)
25{
26 PCUT_ASSERT_INT_EQUALS(8, sizeof(double));
27}
28
29PCUT_TEST(extract_ieee_double_pos_infinity)
30{
31 ieee_double_bits.integer = 0x7FF0000000000000ULL;
32 ieee_double_t d = extract_ieee_double(ieee_double_bits.floating);
33
34 PCUT_ASSERT_TRUE(d.is_special);
35 PCUT_ASSERT_FALSE(d.is_nan);
36 PCUT_ASSERT_TRUE(d.is_infinity);
37 PCUT_ASSERT_FALSE(d.is_negative);
38 PCUT_ASSERT_TRUE(d.is_denormal);
39 PCUT_ASSERT_FALSE(d.is_accuracy_step);
40
41 PCUT_ASSERT_INT_EQUALS(0, d.pos_val.significand);
42 PCUT_ASSERT_INT_EQUALS(0, d.pos_val.exponent);
43}
44
45PCUT_TEST(extract_ieee_double_neg_infinity)
46{
47 ieee_double_bits.integer = 0xFFF0000000000000ULL;
48 ieee_double_t d = extract_ieee_double(ieee_double_bits.floating);
49
50 PCUT_ASSERT_TRUE(d.is_special);
51 PCUT_ASSERT_FALSE(d.is_nan);
52 PCUT_ASSERT_TRUE(d.is_infinity);
53 PCUT_ASSERT_TRUE(d.is_negative);
54 PCUT_ASSERT_TRUE(d.is_denormal);
55 PCUT_ASSERT_FALSE(d.is_accuracy_step);
56
57 PCUT_ASSERT_INT_EQUALS(0, d.pos_val.significand);
58 PCUT_ASSERT_INT_EQUALS(0, d.pos_val.exponent);
59}
60
61PCUT_TEST(extract_ieee_double_nan)
62{
63 ieee_double_bits.integer = 0xFFFFFFFFFFFFFFFFULL;
64 ieee_double_t d = extract_ieee_double(ieee_double_bits.floating);
65
66 PCUT_ASSERT_TRUE(d.is_special);
67 PCUT_ASSERT_TRUE(d.is_nan);
68 PCUT_ASSERT_FALSE(d.is_infinity);
69 PCUT_ASSERT_TRUE(d.is_negative);
70 PCUT_ASSERT_TRUE(d.is_denormal);
71 PCUT_ASSERT_FALSE(d.is_accuracy_step);
72
73 PCUT_ASSERT_INT_EQUALS(0, d.pos_val.significand);
74 PCUT_ASSERT_INT_EQUALS(0, d.pos_val.exponent);
75}
76
77PCUT_TEST(extract_ieee_double_pos_zero)
78{
79 ieee_double_bits.integer = 0x0000000000000000ULL;
80 ieee_double_t d = extract_ieee_double(ieee_double_bits.floating);
81
82 PCUT_ASSERT_FALSE(d.is_special);
83 PCUT_ASSERT_FALSE(d.is_nan);
84 PCUT_ASSERT_FALSE(d.is_infinity);
85 PCUT_ASSERT_FALSE(d.is_negative);
86 PCUT_ASSERT_TRUE(d.is_denormal);
87 PCUT_ASSERT_FALSE(d.is_accuracy_step);
88
89 PCUT_ASSERT_INT_EQUALS(0, d.pos_val.significand);
90}
91
92PCUT_TEST(extract_ieee_double_neg_zero)
93{
94 ieee_double_bits.integer = 0x8000000000000000ULL;
95 ieee_double_t d = extract_ieee_double(ieee_double_bits.floating);
96
97 PCUT_ASSERT_FALSE(d.is_special);
98 PCUT_ASSERT_FALSE(d.is_nan);
99 PCUT_ASSERT_FALSE(d.is_infinity);
100
101 PCUT_ASSERT_TRUE(d.is_negative);
102 PCUT_ASSERT_TRUE(d.is_denormal);
103 PCUT_ASSERT_FALSE(d.is_accuracy_step);
104
105 PCUT_ASSERT_INT_EQUALS(0, d.pos_val.significand);
106}
107
108PCUT_TEST(extract_ieee_double_normal_pos_one)
109{
110 ieee_double_bits.integer = 0x3FF0000000000000ULL;
111 ieee_double_t d = extract_ieee_double(ieee_double_bits.floating);
112
113 PCUT_ASSERT_FALSE(d.is_special);
114 PCUT_ASSERT_FALSE(d.is_nan);
115 PCUT_ASSERT_FALSE(d.is_infinity);
116 PCUT_ASSERT_FALSE(d.is_negative);
117 PCUT_ASSERT_FALSE(d.is_denormal);
118 PCUT_ASSERT_TRUE(d.is_accuracy_step);
119
120 PCUT_ASSERT_INT_EQUALS(HIDDEN_BIT, d.pos_val.significand);
121 PCUT_ASSERT_INT_EQUALS(EXP_BIAS - EXP_BIAS_UNDERFLOWED, d.pos_val.exponent);
122}
123
124PCUT_TEST(extract_ieee_double_normal_neg_one)
125{
126 ieee_double_bits.integer = 0xBFF0000000000000ULL;
127 ieee_double_t d = extract_ieee_double(ieee_double_bits.floating);
128
129 PCUT_ASSERT_FALSE(d.is_special);
130 PCUT_ASSERT_FALSE(d.is_nan);
131 PCUT_ASSERT_FALSE(d.is_infinity);
132 PCUT_ASSERT_TRUE(d.is_negative);
133 PCUT_ASSERT_FALSE(d.is_denormal);
134 PCUT_ASSERT_TRUE(d.is_accuracy_step);
135
136 PCUT_ASSERT_INT_EQUALS(HIDDEN_BIT, d.pos_val.significand);
137 PCUT_ASSERT_INT_EQUALS(EXP_BIAS - EXP_BIAS_UNDERFLOWED, d.pos_val.exponent);
138}
139
140PCUT_TEST(extract_ieee_double_denormal_pos_smallest)
141{
142 ieee_double_bits.integer = 0x0000000000000001ULL;
143 ieee_double_t d = extract_ieee_double(ieee_double_bits.floating);
144
145 PCUT_ASSERT_FALSE(d.is_special);
146 PCUT_ASSERT_FALSE(d.is_nan);
147 PCUT_ASSERT_FALSE(d.is_infinity);
148 PCUT_ASSERT_FALSE(d.is_negative);
149 PCUT_ASSERT_TRUE(d.is_denormal);
150 PCUT_ASSERT_FALSE(d.is_accuracy_step);
151
152 PCUT_ASSERT_INT_EQUALS(1, d.pos_val.significand);
153 PCUT_ASSERT_INT_EQUALS(1 - EXP_BIAS_UNDERFLOWED, d.pos_val.exponent);
154}
155
156PCUT_TEST(extract_ieee_double_denormal_neg_smallest)
157{
158 ieee_double_bits.integer = 0x8000000000000001ULL;
159 ieee_double_t d = extract_ieee_double(ieee_double_bits.floating);
160
161 PCUT_ASSERT_FALSE(d.is_special);
162 PCUT_ASSERT_FALSE(d.is_nan);
163 PCUT_ASSERT_FALSE(d.is_infinity);
164 PCUT_ASSERT_TRUE(d.is_negative);
165 PCUT_ASSERT_TRUE(d.is_denormal);
166 PCUT_ASSERT_FALSE(d.is_accuracy_step);
167
168 PCUT_ASSERT_INT_EQUALS(1, d.pos_val.significand);
169 PCUT_ASSERT_INT_EQUALS(1 - EXP_BIAS_UNDERFLOWED, d.pos_val.exponent);
170}
171
172PCUT_TEST(extract_ieee_double_denormal_pos_largest)
173{
174 ieee_double_bits.integer = 0x000FFFFFFFFFFFFFULL;
175 ieee_double_t d = extract_ieee_double(ieee_double_bits.floating);
176
177 PCUT_ASSERT_FALSE(d.is_special);
178 PCUT_ASSERT_FALSE(d.is_nan);
179 PCUT_ASSERT_FALSE(d.is_infinity);
180 PCUT_ASSERT_FALSE(d.is_negative);
181 PCUT_ASSERT_TRUE(d.is_denormal);
182 PCUT_ASSERT_FALSE(d.is_accuracy_step);
183
184 PCUT_ASSERT_INT_EQUALS(0xFFFFFFFFFFFFFULL, d.pos_val.significand);
185 PCUT_ASSERT_INT_EQUALS(1 - EXP_BIAS_UNDERFLOWED, d.pos_val.exponent);
186}
187
188PCUT_TEST(extract_ieee_double_denormal_neg_largest)
189{
190 ieee_double_bits.integer = 0x800FFFFFFFFFFFFFULL;
191 ieee_double_t d = extract_ieee_double(ieee_double_bits.floating);
192
193 PCUT_ASSERT_FALSE(d.is_special);
194 PCUT_ASSERT_FALSE(d.is_nan);
195 PCUT_ASSERT_FALSE(d.is_infinity);
196 PCUT_ASSERT_TRUE(d.is_negative);
197 PCUT_ASSERT_TRUE(d.is_denormal);
198 PCUT_ASSERT_FALSE(d.is_accuracy_step);
199 PCUT_ASSERT_INT_EQUALS(0xFFFFFFFFFFFFFULL, d.pos_val.significand);
200 PCUT_ASSERT_INT_EQUALS(1 - EXP_BIAS_UNDERFLOWED, d.pos_val.exponent);
201}
202
203PCUT_TEST(extract_ieee_double_normal_pos_smallest)
204{
205 ieee_double_bits.integer = 0x0010000000000000ULL;
206 ieee_double_t d = extract_ieee_double(ieee_double_bits.floating);
207
208 PCUT_ASSERT_FALSE(d.is_special);
209 PCUT_ASSERT_FALSE(d.is_nan);
210 PCUT_ASSERT_FALSE(d.is_infinity);
211 PCUT_ASSERT_FALSE(d.is_negative);
212 PCUT_ASSERT_FALSE(d.is_denormal);
213 PCUT_ASSERT_FALSE(d.is_accuracy_step);
214
215 PCUT_ASSERT_INT_EQUALS(HIDDEN_BIT, d.pos_val.significand);
216 PCUT_ASSERT_INT_EQUALS(1 - EXP_BIAS_UNDERFLOWED, d.pos_val.exponent);
217}
218
219PCUT_TEST(extract_ieee_double_normal_neg_smallest)
220{
221 ieee_double_bits.integer = 0x8010000000000000ULL;
222 ieee_double_t d = extract_ieee_double(ieee_double_bits.floating);
223
224 PCUT_ASSERT_FALSE(d.is_special);
225 PCUT_ASSERT_FALSE(d.is_nan);
226 PCUT_ASSERT_FALSE(d.is_infinity);
227 PCUT_ASSERT_TRUE(d.is_negative);
228 PCUT_ASSERT_FALSE(d.is_denormal);
229 PCUT_ASSERT_FALSE(d.is_accuracy_step);
230
231 PCUT_ASSERT_INT_EQUALS(HIDDEN_BIT, d.pos_val.significand);
232 PCUT_ASSERT_INT_EQUALS(1 - EXP_BIAS_UNDERFLOWED, d.pos_val.exponent);
233}
234
235PCUT_TEST(extract_ieee_double_normal_pos_largest)
236{
237 ieee_double_bits.integer = 0x7FEFFFFFFFFFFFFFULL;
238 ieee_double_t d = extract_ieee_double(ieee_double_bits.floating);
239
240 PCUT_ASSERT_FALSE(d.is_special);
241 PCUT_ASSERT_FALSE(d.is_nan);
242 PCUT_ASSERT_FALSE(d.is_infinity);
243 PCUT_ASSERT_FALSE(d.is_negative);
244 PCUT_ASSERT_FALSE(d.is_denormal);
245 PCUT_ASSERT_FALSE(d.is_accuracy_step);
246
247 PCUT_ASSERT_INT_EQUALS(0xFFFFFFFFFFFFFULL + HIDDEN_BIT, d.pos_val.significand);
248 PCUT_ASSERT_INT_EQUALS(0x7FEULL - EXP_BIAS_UNDERFLOWED, d.pos_val.exponent);
249}
250
251PCUT_TEST(extract_ieee_double_normal_neg_largest)
252{
253 ieee_double_bits.integer = 0xFFEFFFFFFFFFFFFFULL;
254 ieee_double_t d = extract_ieee_double(ieee_double_bits.floating);
255
256 PCUT_ASSERT_FALSE(d.is_special);
257 PCUT_ASSERT_FALSE(d.is_nan);
258 PCUT_ASSERT_FALSE(d.is_infinity);
259 PCUT_ASSERT_TRUE(d.is_negative);
260 PCUT_ASSERT_FALSE(d.is_denormal);
261 PCUT_ASSERT_FALSE(d.is_accuracy_step);
262
263 PCUT_ASSERT_INT_EQUALS(0xFFFFFFFFFFFFFULL + HIDDEN_BIT, d.pos_val.significand);
264 PCUT_ASSERT_INT_EQUALS(0x7FEULL - EXP_BIAS_UNDERFLOWED, d.pos_val.exponent);
265}
266
267PCUT_EXPORT(ieee_double);
Note: See TracBrowser for help on using the repository browser.