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

Last change on this file since db29c34 was db29c34, checked in by Matthieu Riolo <matthieu.riolo@…>, 7 years ago

removing unnecessary comment

  • Property mode set to 100644
File size: 9.3 KB
Line 
1/*
2 * Copyright (c) 2019 Matthieu Riolo
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#include <pcut/pcut.h>
30#include <ieee_double.h>
31
32union {
33 uint64_t integer;
34 double floating;
35} ieee_double_bits;
36
37const int EXP_BIAS = 1023;
38const int EXP_BIAS_UNDERFLOWED = 1075;
39const int SIGN_SHIFT = 52;
40const uint64_t HIDDEN_BIT = 1ULL << SIGN_SHIFT;
41
42PCUT_INIT;
43
44PCUT_TEST_SUITE(ieee_double);
45
46PCUT_TEST(extract_ieee_sizeof_double)
47{
48 PCUT_ASSERT_INT_EQUALS(8, sizeof(double));
49}
50
51PCUT_TEST(extract_ieee_double_pos_infinity)
52{
53 ieee_double_bits.integer = 0x7FF0000000000000ULL;
54 ieee_double_t d = extract_ieee_double(ieee_double_bits.floating);
55
56 PCUT_ASSERT_TRUE(d.is_special);
57 PCUT_ASSERT_FALSE(d.is_nan);
58 PCUT_ASSERT_TRUE(d.is_infinity);
59 PCUT_ASSERT_FALSE(d.is_negative);
60 PCUT_ASSERT_TRUE(d.is_denormal);
61 PCUT_ASSERT_FALSE(d.is_accuracy_step);
62
63 PCUT_ASSERT_INT_EQUALS(0, d.pos_val.significand);
64 PCUT_ASSERT_INT_EQUALS(0, d.pos_val.exponent);
65}
66
67PCUT_TEST(extract_ieee_double_neg_infinity)
68{
69 ieee_double_bits.integer = 0xFFF0000000000000ULL;
70 ieee_double_t d = extract_ieee_double(ieee_double_bits.floating);
71
72 PCUT_ASSERT_TRUE(d.is_special);
73 PCUT_ASSERT_FALSE(d.is_nan);
74 PCUT_ASSERT_TRUE(d.is_infinity);
75 PCUT_ASSERT_TRUE(d.is_negative);
76 PCUT_ASSERT_TRUE(d.is_denormal);
77 PCUT_ASSERT_FALSE(d.is_accuracy_step);
78
79 PCUT_ASSERT_INT_EQUALS(0, d.pos_val.significand);
80 PCUT_ASSERT_INT_EQUALS(0, d.pos_val.exponent);
81}
82
83PCUT_TEST(extract_ieee_double_nan)
84{
85 ieee_double_bits.integer = 0xFFFFFFFFFFFFFFFFULL;
86 ieee_double_t d = extract_ieee_double(ieee_double_bits.floating);
87
88 PCUT_ASSERT_TRUE(d.is_special);
89 PCUT_ASSERT_TRUE(d.is_nan);
90 PCUT_ASSERT_FALSE(d.is_infinity);
91 PCUT_ASSERT_TRUE(d.is_negative);
92 PCUT_ASSERT_TRUE(d.is_denormal);
93 PCUT_ASSERT_FALSE(d.is_accuracy_step);
94
95 PCUT_ASSERT_INT_EQUALS(0, d.pos_val.significand);
96 PCUT_ASSERT_INT_EQUALS(0, d.pos_val.exponent);
97}
98
99PCUT_TEST(extract_ieee_double_pos_zero)
100{
101 ieee_double_bits.integer = 0x0000000000000000ULL;
102 ieee_double_t d = extract_ieee_double(ieee_double_bits.floating);
103
104 PCUT_ASSERT_FALSE(d.is_special);
105 PCUT_ASSERT_FALSE(d.is_nan);
106 PCUT_ASSERT_FALSE(d.is_infinity);
107 PCUT_ASSERT_FALSE(d.is_negative);
108 PCUT_ASSERT_TRUE(d.is_denormal);
109 PCUT_ASSERT_FALSE(d.is_accuracy_step);
110
111 PCUT_ASSERT_INT_EQUALS(0, d.pos_val.significand);
112 PCUT_ASSERT_INT_EQUALS(-EXP_BIAS_UNDERFLOWED, d.pos_val.exponent);
113}
114
115PCUT_TEST(extract_ieee_double_neg_zero)
116{
117 ieee_double_bits.integer = 0x8000000000000000ULL;
118 ieee_double_t d = extract_ieee_double(ieee_double_bits.floating);
119
120 PCUT_ASSERT_FALSE(d.is_special);
121 PCUT_ASSERT_FALSE(d.is_nan);
122 PCUT_ASSERT_FALSE(d.is_infinity);
123
124 PCUT_ASSERT_TRUE(d.is_negative);
125 PCUT_ASSERT_TRUE(d.is_denormal);
126 PCUT_ASSERT_FALSE(d.is_accuracy_step);
127
128 PCUT_ASSERT_INT_EQUALS(0, d.pos_val.significand);
129 PCUT_ASSERT_INT_EQUALS(-EXP_BIAS_UNDERFLOWED, d.pos_val.exponent);
130}
131
132PCUT_TEST(extract_ieee_double_normal_pos_one)
133{
134 ieee_double_bits.integer = 0x3FF0000000000000ULL;
135 ieee_double_t d = extract_ieee_double(ieee_double_bits.floating);
136
137 PCUT_ASSERT_FALSE(d.is_special);
138 PCUT_ASSERT_FALSE(d.is_nan);
139 PCUT_ASSERT_FALSE(d.is_infinity);
140 PCUT_ASSERT_FALSE(d.is_negative);
141 PCUT_ASSERT_FALSE(d.is_denormal);
142 PCUT_ASSERT_TRUE(d.is_accuracy_step);
143
144 PCUT_ASSERT_INT_EQUALS(HIDDEN_BIT, d.pos_val.significand);
145 PCUT_ASSERT_INT_EQUALS(EXP_BIAS - EXP_BIAS_UNDERFLOWED, d.pos_val.exponent);
146}
147
148PCUT_TEST(extract_ieee_double_normal_neg_one)
149{
150 ieee_double_bits.integer = 0xBFF0000000000000ULL;
151 ieee_double_t d = extract_ieee_double(ieee_double_bits.floating);
152
153 PCUT_ASSERT_FALSE(d.is_special);
154 PCUT_ASSERT_FALSE(d.is_nan);
155 PCUT_ASSERT_FALSE(d.is_infinity);
156 PCUT_ASSERT_TRUE(d.is_negative);
157 PCUT_ASSERT_FALSE(d.is_denormal);
158 PCUT_ASSERT_TRUE(d.is_accuracy_step);
159
160 PCUT_ASSERT_INT_EQUALS(HIDDEN_BIT, d.pos_val.significand);
161 PCUT_ASSERT_INT_EQUALS(EXP_BIAS - EXP_BIAS_UNDERFLOWED, d.pos_val.exponent);
162}
163
164PCUT_TEST(extract_ieee_double_denormal_pos_smallest)
165{
166 ieee_double_bits.integer = 0x0000000000000001ULL;
167 ieee_double_t d = extract_ieee_double(ieee_double_bits.floating);
168
169 PCUT_ASSERT_FALSE(d.is_special);
170 PCUT_ASSERT_FALSE(d.is_nan);
171 PCUT_ASSERT_FALSE(d.is_infinity);
172 PCUT_ASSERT_FALSE(d.is_negative);
173 PCUT_ASSERT_TRUE(d.is_denormal);
174 PCUT_ASSERT_FALSE(d.is_accuracy_step);
175
176 PCUT_ASSERT_INT_EQUALS(1, d.pos_val.significand);
177 PCUT_ASSERT_INT_EQUALS(1 - EXP_BIAS_UNDERFLOWED, d.pos_val.exponent);
178}
179
180PCUT_TEST(extract_ieee_double_denormal_neg_smallest)
181{
182 ieee_double_bits.integer = 0x8000000000000001ULL;
183 ieee_double_t d = extract_ieee_double(ieee_double_bits.floating);
184
185 PCUT_ASSERT_FALSE(d.is_special);
186 PCUT_ASSERT_FALSE(d.is_nan);
187 PCUT_ASSERT_FALSE(d.is_infinity);
188 PCUT_ASSERT_TRUE(d.is_negative);
189 PCUT_ASSERT_TRUE(d.is_denormal);
190 PCUT_ASSERT_FALSE(d.is_accuracy_step);
191
192 PCUT_ASSERT_INT_EQUALS(1, d.pos_val.significand);
193 PCUT_ASSERT_INT_EQUALS(1 - EXP_BIAS_UNDERFLOWED, d.pos_val.exponent);
194}
195
196PCUT_TEST(extract_ieee_double_denormal_pos_largest)
197{
198 ieee_double_bits.integer = 0x000FFFFFFFFFFFFFULL;
199 ieee_double_t d = extract_ieee_double(ieee_double_bits.floating);
200
201 PCUT_ASSERT_FALSE(d.is_special);
202 PCUT_ASSERT_FALSE(d.is_nan);
203 PCUT_ASSERT_FALSE(d.is_infinity);
204 PCUT_ASSERT_FALSE(d.is_negative);
205 PCUT_ASSERT_TRUE(d.is_denormal);
206 PCUT_ASSERT_FALSE(d.is_accuracy_step);
207
208 PCUT_ASSERT_INT_EQUALS(0xFFFFFFFFFFFFFULL, d.pos_val.significand);
209 PCUT_ASSERT_INT_EQUALS(1 - EXP_BIAS_UNDERFLOWED, d.pos_val.exponent);
210}
211
212PCUT_TEST(extract_ieee_double_denormal_neg_largest)
213{
214 ieee_double_bits.integer = 0x800FFFFFFFFFFFFFULL;
215 ieee_double_t d = extract_ieee_double(ieee_double_bits.floating);
216
217 PCUT_ASSERT_FALSE(d.is_special);
218 PCUT_ASSERT_FALSE(d.is_nan);
219 PCUT_ASSERT_FALSE(d.is_infinity);
220 PCUT_ASSERT_TRUE(d.is_negative);
221 PCUT_ASSERT_TRUE(d.is_denormal);
222 PCUT_ASSERT_FALSE(d.is_accuracy_step);
223 PCUT_ASSERT_INT_EQUALS(0xFFFFFFFFFFFFFULL, d.pos_val.significand);
224 PCUT_ASSERT_INT_EQUALS(1 - EXP_BIAS_UNDERFLOWED, d.pos_val.exponent);
225}
226
227PCUT_TEST(extract_ieee_double_normal_pos_smallest)
228{
229 ieee_double_bits.integer = 0x0010000000000000ULL;
230 ieee_double_t d = extract_ieee_double(ieee_double_bits.floating);
231
232 PCUT_ASSERT_FALSE(d.is_special);
233 PCUT_ASSERT_FALSE(d.is_nan);
234 PCUT_ASSERT_FALSE(d.is_infinity);
235 PCUT_ASSERT_FALSE(d.is_negative);
236 PCUT_ASSERT_FALSE(d.is_denormal);
237 PCUT_ASSERT_FALSE(d.is_accuracy_step);
238
239 PCUT_ASSERT_INT_EQUALS(HIDDEN_BIT, d.pos_val.significand);
240 PCUT_ASSERT_INT_EQUALS(1 - EXP_BIAS_UNDERFLOWED, d.pos_val.exponent);
241}
242
243PCUT_TEST(extract_ieee_double_normal_neg_smallest)
244{
245 ieee_double_bits.integer = 0x8010000000000000ULL;
246 ieee_double_t d = extract_ieee_double(ieee_double_bits.floating);
247
248 PCUT_ASSERT_FALSE(d.is_special);
249 PCUT_ASSERT_FALSE(d.is_nan);
250 PCUT_ASSERT_FALSE(d.is_infinity);
251 PCUT_ASSERT_TRUE(d.is_negative);
252 PCUT_ASSERT_FALSE(d.is_denormal);
253 PCUT_ASSERT_FALSE(d.is_accuracy_step);
254
255 PCUT_ASSERT_INT_EQUALS(HIDDEN_BIT, d.pos_val.significand);
256 PCUT_ASSERT_INT_EQUALS(1 - EXP_BIAS_UNDERFLOWED, d.pos_val.exponent);
257}
258
259PCUT_TEST(extract_ieee_double_normal_pos_largest)
260{
261 ieee_double_bits.integer = 0x7FEFFFFFFFFFFFFFULL;
262 ieee_double_t d = extract_ieee_double(ieee_double_bits.floating);
263
264 PCUT_ASSERT_FALSE(d.is_special);
265 PCUT_ASSERT_FALSE(d.is_nan);
266 PCUT_ASSERT_FALSE(d.is_infinity);
267 PCUT_ASSERT_FALSE(d.is_negative);
268 PCUT_ASSERT_FALSE(d.is_denormal);
269 PCUT_ASSERT_FALSE(d.is_accuracy_step);
270
271 PCUT_ASSERT_INT_EQUALS(0xFFFFFFFFFFFFFULL + HIDDEN_BIT, d.pos_val.significand);
272 PCUT_ASSERT_INT_EQUALS(0x7FEULL - EXP_BIAS_UNDERFLOWED, d.pos_val.exponent);
273}
274
275PCUT_TEST(extract_ieee_double_normal_neg_largest)
276{
277 ieee_double_bits.integer = 0xFFEFFFFFFFFFFFFFULL;
278 ieee_double_t d = extract_ieee_double(ieee_double_bits.floating);
279
280 PCUT_ASSERT_FALSE(d.is_special);
281 PCUT_ASSERT_FALSE(d.is_nan);
282 PCUT_ASSERT_FALSE(d.is_infinity);
283 PCUT_ASSERT_TRUE(d.is_negative);
284 PCUT_ASSERT_FALSE(d.is_denormal);
285 PCUT_ASSERT_FALSE(d.is_accuracy_step);
286
287 PCUT_ASSERT_INT_EQUALS(0xFFFFFFFFFFFFFULL + HIDDEN_BIT, d.pos_val.significand);
288 PCUT_ASSERT_INT_EQUALS(0x7FEULL - EXP_BIAS_UNDERFLOWED, d.pos_val.exponent);
289}
290
291PCUT_EXPORT(ieee_double);
Note: See TracBrowser for help on using the repository browser.