Add test case from a recent glibc bug.
[gnulib.git] / tests / test-logb.h
blob2be2b164e69964d7b0819bcf27c90a66e6990a8b
1 /* Test of logb*() function family.
2 Copyright (C) 2012-2018 Free Software Foundation, Inc.
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 3 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <https://www.gnu.org/licenses/>. */
17 static DOUBLE
18 my_ldexp (DOUBLE x, int d)
20 for (; d > 0; d--)
21 x *= L_(2.0);
22 for (; d < 0; d++)
23 x *= L_(0.5);
24 return x;
27 static void
28 test_function (void)
30 int i;
31 VOLATILE DOUBLE x;
32 DOUBLE y;
34 /* Some particular values. */
35 x = L_(0.6);
36 y = LOGB (x);
37 ASSERT (y == - L_(1.0));
39 x = L_(1.2);
40 y = LOGB (x);
41 ASSERT (y == L_(0.0));
43 x = L_(2.1);
44 y = LOGB (x);
45 ASSERT (y == L_(1.0));
47 x = L_(3.9);
48 y = LOGB (x);
49 ASSERT (y == L_(1.0));
51 x = L_(4.0);
52 y = LOGB (x);
53 ASSERT (y == (FLT_RADIX == 2 ? L_(2.0) : L_(1.0)));
55 x = L_(0.25);
56 y = LOGB (x);
57 ASSERT (y == (FLT_RADIX == 2 ? - L_(2.0) : - L_(1.0)));
59 /* Zero. */
60 ASSERT (LOGB (L_(0.0)) == - HUGEVAL);
61 ASSERT (LOGB (MINUS_ZERO) == - HUGEVAL);
63 /* From here on, this test assumes FLT_RADIX == 2. */
65 for (i = 1, x = L_(1.0); i <= MAX_EXP; i++, x *= L_(2.0))
67 y = LOGB (x);
68 ASSERT (y == (DOUBLE)(i - 1));
70 for (i = 1, x = L_(1.0); i >= MIN_NORMAL_EXP; i--, x *= L_(0.5))
72 y = LOGB (x);
73 ASSERT (y == (DOUBLE)(i - 1));
75 for (; i >= MIN_EXP - 100 && x > L_(0.0); i--, x *= L_(0.5))
77 y = LOGB (x);
78 ASSERT (y == (DOUBLE)(i - 1));
81 for (i = 1, x = - L_(1.0); i <= MAX_EXP; i++, x *= L_(2.0))
83 y = LOGB (x);
84 ASSERT (y == (DOUBLE)(i - 1));
86 for (i = 1, x = - L_(1.0); i >= MIN_NORMAL_EXP; i--, x *= L_(0.5))
88 y = LOGB (x);
89 ASSERT (y == (DOUBLE)(i - 1));
91 for (; i >= MIN_EXP - 100 && x < L_(0.0); i--, x *= L_(0.5))
93 y = LOGB (x);
94 ASSERT (y == (DOUBLE)(i - 1));
97 for (i = 1, x = L_(1.01); i <= MAX_EXP; i++, x *= L_(2.0))
99 y = LOGB (x);
100 ASSERT (y == (DOUBLE)(i - 1));
102 for (i = 1, x = L_(1.01); i >= MIN_NORMAL_EXP; i--, x *= L_(0.5))
104 y = LOGB (x);
105 ASSERT (y == (DOUBLE)(i - 1));
107 for (; i >= MIN_EXP - 100 && x > L_(0.0); i--, x *= L_(0.5))
109 y = LOGB (x);
110 ASSERT (y == (DOUBLE)(i - 1));
113 for (i = 1, x = L_(1.73205); i <= MAX_EXP; i++, x *= L_(2.0))
115 y = LOGB (x);
116 ASSERT (y == (DOUBLE)(i - 1));
118 for (i = 1, x = L_(1.73205); i >= MIN_NORMAL_EXP; i--, x *= L_(0.5))
120 y = LOGB (x);
121 ASSERT (y == (DOUBLE)(i - 1));
123 for (; i >= MIN_EXP - 100 && x > L_(0.0); i--, x *= L_(0.5))
125 y = LOGB (x);
126 ASSERT (y == (DOUBLE)(i - 1) || y == (DOUBLE)i);
129 /* Randomized tests. */
130 for (i = 0; i < SIZEOF (RANDOM); i++)
132 x = L_(20.0) * RANDOM[i] - L_(10.0); /* -10.0 <= x <= 10.0 */
133 if (x != L_(0.0))
135 DOUBLE abs_x = (x < L_(0.0) ? - x : x);
136 y = LOGB (x);
137 ASSERT (y == (DOUBLE) (int) y);
138 ASSERT (abs_x >= my_ldexp (L_(1.0), (int) y));
139 ASSERT (abs_x < my_ldexp (L_(1.0), (int) y + 1));
144 volatile DOUBLE x;
145 DOUBLE y;