xref: /reactos/modules/rostests/apitests/crt/ceil.c (revision 84344399)
1 /*
2  * PROJECT:     ReactOS API tests
3  * LICENSE:     MIT (https://spdx.org/licenses/MIT)
4  * PURPOSE:     Tests for ceil / ceilf
5  * COPYRIGHT:   Copyright 2021 Timo Kreuzer <timo.kreuzer@reactos.org>
6  */
7 
8 #if !defined(_CRTBLD) && !defined(_M_IX86)
9 #define _CRTBLD // we don't want inline ceilf!
10 #endif
11 #include "math_helpers.h"
12 
13 #ifdef _MSC_VER
14 #pragma function(ceil)
15 // ceilf is not available as an intrinsic
16 #endif
17 
18 static TESTENTRY_DBL s_ceil_tests[] =
19 {
20     /* Special values */
21     { 0x0000000000000000 /*  0.000000000000000e+000 */, 0x0000000000000000 /*  0.000000000000000e+000 */ },
22     { 0x8000000000000000 /* -0.000000000000000e+000 */, 0x8000000000000000 /*  0.000000000000000e+000 */ },
23     { 0x7ff0000000000000 /*  1.#INF00000000000e+000 */, 0x7ff0000000000000 /*  1.#INF00000000000e+000 */ },
24     { 0x7ff0000000000001 /*  1.#QNAN0000000000e+000 */, 0x7ff8000000000001 /*  1.#QNAN0000000000e+000 */ },
25     { 0x7ff7ffffffffffff /*  1.#QNAN0000000000e+000 */, 0x7fffffffffffffff /*  1.#QNAN0000000000e+000 */ },
26     { 0x7ff8000000000000 /*  1.#QNAN0000000000e+000 */, 0x7ff8000000000000 /*  1.#QNAN0000000000e+000 */ },
27     { 0x7ff8000000000001 /*  1.#QNAN0000000000e+000 */, 0x7ff8000000000001 /*  1.#QNAN0000000000e+000 */ },
28     { 0x7fffffffffffffff /*  1.#QNAN0000000000e+000 */, 0x7fffffffffffffff /*  1.#QNAN0000000000e+000 */ },
29     { 0xfff0000000000000 /* -1.#INF00000000000e+000 */, 0xfff0000000000000 /* -1.#INF00000000000e+000 */ },
30     { 0xfff0000000000001 /* -1.#QNAN0000000000e+000 */, 0xfff8000000000001 /* -1.#QNAN0000000000e+000 */ },
31     { 0xfff7ffffffffffff /* -1.#QNAN0000000000e+000 */, 0xffffffffffffffff /* -1.#QNAN0000000000e+000 */ },
32     { 0xfff8000000000000 /* -1.#IND00000000000e+000 */, 0xfff8000000000000 /* -1.#IND00000000000e+000 */ },
33     { 0xfff8000000000001 /* -1.#QNAN0000000000e+000 */, 0xfff8000000000001 /* -1.#QNAN0000000000e+000 */ },
34     { 0xffffffffffffffff /* -1.#QNAN0000000000e+000 */, 0xffffffffffffffff /* -1.#QNAN0000000000e+000 */ },
35 
36     /* Some random floats */
37     { 0x84be2329aed66ce1 /* -7.916792434840887e-286 */, 0x8000000000000000 /* -0.000000000000000e+000 */ },
38     { 0xf1499052ebe9bbf1 /* -5.202012813127544e+237 */, 0xf1499052ebe9bbf1 /* -5.202012813127544e+237 */ },
39     { 0x3cdba6b3993e0c87 /*  1.534948721304537e-015 */, 0x3ff0000000000000 /*  1.000000000000000e+000 */ },
40     { 0x1c0d5e24de47b706 /*  1.484236768428990e-173 */, 0x3ff0000000000000 /*  1.000000000000000e+000 */ },
41     { 0xc84d12b3a68bbb43 /* -1.978609508743937e+040 */, 0xc84d12b3a68bbb43 /* -1.978609508743937e+040 */ },
42     { 0x7d5a031f1f253809 /*  6.645271626742043e+295 */, 0x7d5a031f1f253809 /*  6.645271626742043e+295 */ },
43     { 0xfccbd45d3b45f596 /* -1.388583322422121e+293 */, 0xfccbd45d3b45f596 /* -1.388583322422121e+293 */ },
44     { 0x0a890d1332aedb1c /*  6.517185427488806e-258 */, 0x3ff0000000000000 /*  1.000000000000000e+000 */ },
45     { 0xee509a20fd367840 /* -2.400484647490954e+223 */, 0xee509a20fd367840 /* -2.400484647490954e+223 */ },
46     { 0xf6324912dc497d9e /* -2.249167320514119e+261 */, 0xf6324912dc497d9e /* -2.249167320514119e+261 */ },
47 };
48 
49 
50 void Test_ceil(void)
51 {
52     int i;
53 
54     for (i = 0; i < _countof(s_ceil_tests); i++)
55     {
56         double x = u64_to_dbl(s_ceil_tests[i].x);
57         double z = ceil(x);
58         ok_eq_dbl_exact("ceil", s_ceil_tests[i].x, z, s_ceil_tests[i].result);
59     }
60 }
61 
62 static TESTENTRY_FLT s_ceilf_tests[] =
63 {
64     /* Special values */
65     { 0x00000000 /*  0.000000e+000 */, 0x00000000 /*  0.000000e+000 */ },
66     { 0x80000000 /* -0.000000e+000 */, 0x80000000 /*  0.000000e+000 */ },
67     { 0x00000000 /*  0.000000e+000 */, 0x00000000 /*  0.000000e+000 */ },
68     { 0x00000001 /*  1.401298e-045 */, 0x3f800000 /*  1.000000e+000 */ },
69     { 0xffffffff /* -1.#QNAN0e+000 */, 0xffffffff /* -1.#QNAN0e+000 */ },
70     { 0x00000000 /*  0.000000e+000 */, 0x00000000 /*  0.000000e+000 */ },
71     { 0x00000001 /*  1.401298e-045 */, 0x3f800000 /*  1.000000e+000 */ },
72     { 0xffffffff /* -1.#QNAN0e+000 */, 0xffffffff /* -1.#QNAN0e+000 */ },
73     { 0x00000000 /*  0.000000e+000 */, 0x00000000 /*  0.000000e+000 */ },
74     { 0x00000001 /*  1.401298e-045 */, 0x3f800000 /*  1.000000e+000 */ },
75     { 0xffffffff /* -1.#QNAN0e+000 */, 0xffffffff /* -1.#QNAN0e+000 */ },
76     { 0x00000000 /*  0.000000e+000 */, 0x00000000 /*  0.000000e+000 */ },
77     { 0x00000001 /*  1.401298e-045 */, 0x3f800000 /*  1.000000e+000 */ },
78     { 0xffffffff /* -1.#QNAN0e+000 */, 0xffffffff /* -1.#QNAN0e+000 */ },
79 
80     /* Some random floats */
81     { 0xf2144fad /* -2.937607e+030 */, 0xf2144fad /* -2.937607e+030 */ },
82     { 0xd0664044 /* -1.545189e+010 */, 0xd0664044 /* -1.545189e+010 */ },
83     { 0xb730c46b /* -1.053615e-005 */, 0x80000000 /* -0.000000e+000 */ },
84     { 0x22a13b32 /*  4.370181e-018 */, 0x3f800000 /*  1.000000e+000 */ },
85     { 0x9d9122f6 /* -3.841733e-021 */, 0x80000000 /* -0.000000e+000 */ },
86     { 0xda1f8be1 /* -1.122708e+016 */, 0xda1f8be1 /* -1.122708e+016 */ },
87     { 0x0299cab0 /*  2.259767e-037 */, 0x3f800000 /*  1.000000e+000 */ },
88     { 0x499d72b9 /*  1.289815e+006 */, 0x499d72c0 /*  1.289816e+006 */ },
89     { 0xc57e802c /* -4.072011e+003 */, 0xc57e8000 /* -4.072000e+003 */ },
90     { 0x80e9d599 /* -2.147430e-038 */, 0x80000000 /* -0.000000e+000 */ },
91 };
92 
93 void Test_ceilf(void)
94 {
95     int i;
96 
97     for (i = 0; i < _countof(s_ceilf_tests); i++)
98     {
99         float x = u32_to_flt(s_ceilf_tests[i].x);
100         float z = ceilf(x);
101         ok_eq_flt_exact("ceilf", s_ceilf_tests[i].x, z, s_ceilf_tests[i].result);
102     }
103 }
104 
105 START_TEST(ceil)
106 {
107     Test_ceil();
108     Test_ceilf();
109 }
110