t_log.c revision 1.15.2.1 1 1.15.2.1 perseant /* $NetBSD: t_log.c,v 1.15.2.1 2025/08/02 05:58:08 perseant Exp $ */
2 1.1 jruoho
3 1.1 jruoho /*-
4 1.1 jruoho * Copyright (c) 2011 The NetBSD Foundation, Inc.
5 1.1 jruoho * All rights reserved.
6 1.1 jruoho *
7 1.1 jruoho * This code is derived from software contributed to The NetBSD Foundation
8 1.1 jruoho * by Jukka Ruohonen.
9 1.1 jruoho *
10 1.1 jruoho * Redistribution and use in source and binary forms, with or without
11 1.1 jruoho * modification, are permitted provided that the following conditions
12 1.1 jruoho * are met:
13 1.1 jruoho * 1. Redistributions of source code must retain the above copyright
14 1.1 jruoho * notice, this list of conditions and the following disclaimer.
15 1.1 jruoho * 2. Redistributions in binary form must reproduce the above copyright
16 1.1 jruoho * notice, this list of conditions and the following disclaimer in the
17 1.1 jruoho * documentation and/or other materials provided with the distribution.
18 1.1 jruoho *
19 1.1 jruoho * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 1.1 jruoho * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 1.1 jruoho * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 1.1 jruoho * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 1.1 jruoho * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 1.1 jruoho * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 1.1 jruoho * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 1.1 jruoho * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 1.1 jruoho * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 1.1 jruoho * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 1.1 jruoho * POSSIBILITY OF SUCH DAMAGE.
30 1.1 jruoho */
31 1.1 jruoho #include <sys/cdefs.h>
32 1.15.2.1 perseant __RCSID("$NetBSD: t_log.c,v 1.15.2.1 2025/08/02 05:58:08 perseant Exp $");
33 1.15.2.1 perseant
34 1.15.2.1 perseant #include <sys/types.h>
35 1.1 jruoho
36 1.3 jruoho #include <atf-c.h>
37 1.7 jruoho
38 1.15.2.1 perseant #include <errno.h>
39 1.14 riastrad #include <float.h>
40 1.7 jruoho #include <math.h>
41 1.3 jruoho #include <stdio.h>
42 1.7 jruoho #include <string.h>
43 1.1 jruoho
44 1.15.2.1 perseant #define CHECK_EQ(i, f, x, y) \
45 1.15.2.1 perseant ATF_CHECK_EQ_MSG(f(x), y, \
46 1.15.2.1 perseant "[%u] %s(%a=%.17g)=%a=%.17g, expected %a=%.17g", \
47 1.15.2.1 perseant (i), #f, (double)(x), (double)(x), f(x), f(x), \
48 1.15.2.1 perseant (double)(y), (double)(y))
49 1.15.2.1 perseant
50 1.15.2.1 perseant #define CHECKL_EQ(i, f, x, y) \
51 1.15.2.1 perseant ATF_CHECK_EQ_MSG(f(x), y, \
52 1.15.2.1 perseant "[%u] %s(%La=%.34Lg)=%La=%.34Lg, expected %La=%.34Lg", \
53 1.15.2.1 perseant (i), #f, (long double)(x), (long double)(x), f(x), f(x), \
54 1.15.2.1 perseant (long double)(y), (long double)(y))
55 1.15.2.1 perseant
56 1.15.2.1 perseant #ifdef NAN
57 1.15.2.1 perseant
58 1.15.2.1 perseant #define CHECK_NAN(i, f, x) \
59 1.15.2.1 perseant ATF_CHECK_MSG(isnan(f(x)), \
60 1.15.2.1 perseant "[%u] %s(%a=%.17g)=%a=%.17g, expected NaN", \
61 1.15.2.1 perseant (i), #f, (x), (x), f(x), f(x))
62 1.15.2.1 perseant
63 1.15.2.1 perseant #define CHECKL_NAN(i, f, x) \
64 1.15.2.1 perseant ATF_CHECK_MSG(isnan(f(x)), \
65 1.15.2.1 perseant "[%u] %s(%La=%.34Lg)=%La=%.34Lg, expected NaN", \
66 1.15.2.1 perseant (i), #f, (long double)(x), (long double)(x), f(x), f(x))
67 1.15.2.1 perseant
68 1.15.2.1 perseant #else /* !defined(NAN) */
69 1.15.2.1 perseant
70 1.15.2.1 perseant #define CHECK_NAN(i, f, x) do \
71 1.15.2.1 perseant { \
72 1.15.2.1 perseant int _checknan_error; \
73 1.15.2.1 perseant double _checknan_result; \
74 1.15.2.1 perseant errno = 0; \
75 1.15.2.1 perseant _checknan_result = f(x); \
76 1.15.2.1 perseant _checknan_error = errno; \
77 1.15.2.1 perseant ATF_CHECK_EQ_MSG(errno, EDOM, \
78 1.15.2.1 perseant "[%u] %s(%a=%.17g)=%a=%.17g errno=%d, expected EDOM=%d", \
79 1.15.2.1 perseant (i), #f, (double)(x), (double)(x), \
80 1.15.2.1 perseant _checknan_result, _checknan_result, \
81 1.15.2.1 perseant _checknan_error, EDOM); \
82 1.15.2.1 perseant } while (0)
83 1.15.2.1 perseant
84 1.15.2.1 perseant #define CHECKL_NAN(i, f, x) do \
85 1.15.2.1 perseant { \
86 1.15.2.1 perseant int _checknan_error; \
87 1.15.2.1 perseant long double _checknan_result; \
88 1.15.2.1 perseant errno = 0; \
89 1.15.2.1 perseant _checknan_result = f(x); \
90 1.15.2.1 perseant _checknan_error = errno; \
91 1.15.2.1 perseant ATF_CHECK_EQ_MSG(errno, EDOM, \
92 1.15.2.1 perseant "[%u] %s(%La=%.34Lg)=%La=%.34Lg errno=%d, expected EDOM=%d", \
93 1.15.2.1 perseant (i), #f, (long double)(x), (long double)(x), \
94 1.15.2.1 perseant _checknan_result, _checknan_result, \
95 1.15.2.1 perseant _checknan_error, EDOM); \
96 1.15.2.1 perseant } while (0)
97 1.15.2.1 perseant
98 1.15.2.1 perseant #endif /* NAN */
99 1.15.2.1 perseant
100 1.15.2.1 perseant static const float logf_invalid[] = {
101 1.15.2.1 perseant #ifdef NAN
102 1.15.2.1 perseant NAN,
103 1.15.2.1 perseant #endif
104 1.15.2.1 perseant -HUGE_VALF,
105 1.15.2.1 perseant -FLT_MAX,
106 1.15.2.1 perseant -10,
107 1.15.2.1 perseant -1,
108 1.15.2.1 perseant -FLT_EPSILON,
109 1.15.2.1 perseant -FLT_MIN,
110 1.15.2.1 perseant #ifdef FLT_DENORM_MIN
111 1.15.2.1 perseant -FLT_DENORM_MIN,
112 1.15.2.1 perseant #endif
113 1.15.2.1 perseant };
114 1.15.2.1 perseant
115 1.15.2.1 perseant static const double log_invalid[] = {
116 1.15.2.1 perseant #ifdef NAN
117 1.15.2.1 perseant NAN,
118 1.15.2.1 perseant #endif
119 1.15.2.1 perseant -HUGE_VAL,
120 1.15.2.1 perseant -DBL_MAX,
121 1.15.2.1 perseant -10,
122 1.15.2.1 perseant -1,
123 1.15.2.1 perseant -DBL_EPSILON,
124 1.15.2.1 perseant -DBL_MIN,
125 1.15.2.1 perseant #ifdef DBL_DENORM_MIN
126 1.15.2.1 perseant -DBL_DENORM_MIN,
127 1.15.2.1 perseant #endif
128 1.15.2.1 perseant };
129 1.15.2.1 perseant
130 1.15.2.1 perseant static const long double logl_invalid[] = {
131 1.15.2.1 perseant #ifdef NAN
132 1.15.2.1 perseant NAN,
133 1.15.2.1 perseant #endif
134 1.15.2.1 perseant -HUGE_VALL,
135 1.15.2.1 perseant -LDBL_MAX,
136 1.15.2.1 perseant -10,
137 1.15.2.1 perseant -1,
138 1.15.2.1 perseant -LDBL_EPSILON,
139 1.15.2.1 perseant -LDBL_MIN,
140 1.15.2.1 perseant #ifdef LDBL_DENORM_MIN
141 1.15.2.1 perseant -LDBL_DENORM_MIN,
142 1.15.2.1 perseant #endif
143 1.15.2.1 perseant };
144 1.15.2.1 perseant
145 1.15.2.1 perseant static const float log1pf_invalid[] = {
146 1.15.2.1 perseant #ifdef NAN
147 1.15.2.1 perseant NAN,
148 1.15.2.1 perseant #endif
149 1.15.2.1 perseant -HUGE_VALF,
150 1.15.2.1 perseant -FLT_MAX,
151 1.15.2.1 perseant -10,
152 1.15.2.1 perseant -1 - FLT_EPSILON,
153 1.15.2.1 perseant };
154 1.15.2.1 perseant
155 1.15.2.1 perseant static const double log1p_invalid[] = {
156 1.15.2.1 perseant #ifdef NAN
157 1.15.2.1 perseant NAN,
158 1.15.2.1 perseant #endif
159 1.15.2.1 perseant -HUGE_VAL,
160 1.15.2.1 perseant -DBL_MAX,
161 1.15.2.1 perseant -10,
162 1.15.2.1 perseant -1 - DBL_EPSILON,
163 1.15.2.1 perseant };
164 1.15.2.1 perseant
165 1.15.2.1 perseant static const long double log1pl_invalid[] = {
166 1.15.2.1 perseant #ifdef NAN
167 1.15.2.1 perseant NAN,
168 1.15.2.1 perseant #endif
169 1.15.2.1 perseant -HUGE_VALL,
170 1.15.2.1 perseant -LDBL_MAX,
171 1.15.2.1 perseant -10,
172 1.15.2.1 perseant -1 - LDBL_EPSILON,
173 1.15.2.1 perseant };
174 1.15.2.1 perseant
175 1.3 jruoho /*
176 1.3 jruoho * log10(3)
177 1.3 jruoho */
178 1.15.2.1 perseant static const struct {
179 1.15.2.1 perseant float x, y;
180 1.15.2.1 perseant } log10f_exact[] = {
181 1.15.2.1 perseant { 1, 0 },
182 1.15.2.1 perseant { 10, 1 },
183 1.15.2.1 perseant { 100, 2 },
184 1.15.2.1 perseant };
185 1.5 jruoho
186 1.15.2.1 perseant ATF_TC(log10_invalid);
187 1.15.2.1 perseant ATF_TC_HEAD(log10_invalid, tc)
188 1.5 jruoho {
189 1.15.2.1 perseant atf_tc_set_md_var(tc, "descr", "Test log10/f/l on invalid inputs");
190 1.5 jruoho }
191 1.15.2.1 perseant ATF_TC_BODY(log10_invalid, tc)
192 1.3 jruoho {
193 1.15.2.1 perseant unsigned i;
194 1.3 jruoho
195 1.15.2.1 perseant for (i = 0; i < __arraycount(logf_invalid); i++) {
196 1.15.2.1 perseant CHECK_NAN(i, log10f, logf_invalid[i]);
197 1.15.2.1 perseant CHECK_NAN(i, log10, logf_invalid[i]);
198 1.15.2.1 perseant CHECKL_NAN(i, log10l, logf_invalid[i]);
199 1.15.2.1 perseant }
200 1.3 jruoho
201 1.15.2.1 perseant for (i = 0; i < __arraycount(log_invalid); i++) {
202 1.15.2.1 perseant CHECK_NAN(i, log10, log_invalid[i]);
203 1.15.2.1 perseant CHECKL_NAN(i, log10l, log_invalid[i]);
204 1.15.2.1 perseant }
205 1.3 jruoho
206 1.15.2.1 perseant for (i = 0; i < __arraycount(logl_invalid); i++) {
207 1.15.2.1 perseant CHECKL_NAN(i, log10l, logl_invalid[i]);
208 1.15.2.1 perseant }
209 1.3 jruoho }
210 1.3 jruoho
211 1.15.2.1 perseant ATF_TC(log10_zero);
212 1.15.2.1 perseant ATF_TC_HEAD(log10_zero, tc)
213 1.3 jruoho {
214 1.15.2.1 perseant atf_tc_set_md_var(tc, "descr", "Test log10/f/l on zero");
215 1.3 jruoho }
216 1.15.2.1 perseant ATF_TC_BODY(log10_zero, tc)
217 1.3 jruoho {
218 1.3 jruoho
219 1.15.2.1 perseant CHECK_EQ(0, log10f, +0., -HUGE_VALF);
220 1.15.2.1 perseant CHECK_EQ(0, log10, +0., -HUGE_VAL);
221 1.15.2.1 perseant CHECKL_EQ(0, log10l, +0., -HUGE_VALL);
222 1.3 jruoho
223 1.15.2.1 perseant CHECK_EQ(1, log10f, -0., -HUGE_VALF);
224 1.15.2.1 perseant CHECK_EQ(1, log10, -0., -HUGE_VAL);
225 1.15.2.1 perseant CHECKL_EQ(1, log10l, -0., -HUGE_VALL);
226 1.3 jruoho }
227 1.3 jruoho
228 1.15.2.1 perseant ATF_TC(log10_exact);
229 1.15.2.1 perseant ATF_TC_HEAD(log10_exact, tc)
230 1.3 jruoho {
231 1.15.2.1 perseant atf_tc_set_md_var(tc, "descr", "Test log10/f/l exact cases");
232 1.3 jruoho }
233 1.15.2.1 perseant ATF_TC_BODY(log10_exact, tc)
234 1.3 jruoho {
235 1.15.2.1 perseant unsigned i;
236 1.3 jruoho
237 1.15.2.1 perseant ATF_CHECK_EQ(signbit(log10f(1)), 0);
238 1.15.2.1 perseant ATF_CHECK_EQ(signbit(log10(1)), 0);
239 1.15.2.1 perseant ATF_CHECK_EQ(signbit(log10l(1)), 0);
240 1.3 jruoho
241 1.15.2.1 perseant for (i = 0; i < __arraycount(log10f_exact); i++) {
242 1.15.2.1 perseant const float x = log10f_exact[i].x;
243 1.15.2.1 perseant const float y = log10f_exact[i].y;
244 1.3 jruoho
245 1.15.2.1 perseant CHECK_EQ(i, log10f, x, y);
246 1.15.2.1 perseant CHECK_EQ(i, log10, x, y);
247 1.15.2.1 perseant CHECKL_EQ(i, log10l, x, y);
248 1.15.2.1 perseant }
249 1.3 jruoho }
250 1.3 jruoho
251 1.15.2.1 perseant ATF_TC(log10_approx);
252 1.15.2.1 perseant ATF_TC_HEAD(log10_approx, tc)
253 1.3 jruoho {
254 1.15.2.1 perseant atf_tc_set_md_var(tc, "descr", "Test log10/f/l approximate cases");
255 1.3 jruoho }
256 1.15.2.1 perseant ATF_TC_BODY(log10_approx, tc)
257 1.5 jruoho {
258 1.15.2.1 perseant volatile long double e =
259 1.15.2.1 perseant 2.7182818284590452353602874713526624977572470937L;
260 1.15.2.1 perseant volatile long double e2 =
261 1.15.2.1 perseant 7.3890560989306502272304274605750078131803155705519L;
262 1.15.2.1 perseant volatile long double log10e =
263 1.15.2.1 perseant 0.43429448190325182765112891891660508229439700580367L;
264 1.15.2.1 perseant volatile long double log10e2 =
265 1.15.2.1 perseant 2*0.43429448190325182765112891891660508229439700580367L;
266 1.5 jruoho
267 1.15.2.1 perseant ATF_CHECK_MSG((fabsf((log10f(e) - (float)log10e)/(float)log10e) <
268 1.15.2.1 perseant 2*FLT_EPSILON),
269 1.15.2.1 perseant "log10f(e)=%a=%.8g expected %a=%.8g",
270 1.15.2.1 perseant log10f(e), log10f(e), (float)log10e, (float)log10e);
271 1.15.2.1 perseant ATF_CHECK_MSG((fabs((log10(e) - (double)log10e)/(double)log10e) <
272 1.15.2.1 perseant 2*DBL_EPSILON),
273 1.15.2.1 perseant "log10(e)=%a=%.17g expected %a=%.17g",
274 1.15.2.1 perseant log10(e), log10(e), (double)log10e, (double)log10e);
275 1.15.2.1 perseant ATF_CHECK_MSG((fabsl((log10l(e) - log10e)/log10e) < 2*LDBL_EPSILON),
276 1.15.2.1 perseant "log10l(e)=%La=%.34Lg expected %La=%.34Lg",
277 1.15.2.1 perseant log10l(e), log10l(e), log10e, log10e);
278 1.5 jruoho
279 1.15.2.1 perseant ATF_CHECK_MSG((fabsf((log10f(e2) - (float)log10e2)/(float)log10e2) <
280 1.15.2.1 perseant 2*FLT_EPSILON),
281 1.15.2.1 perseant "log10f(e^2)=%a=%.8g expected %a=%.8g",
282 1.15.2.1 perseant log10f(e2), log10f(e2), (float)log10e2, (float)log10e2);
283 1.15.2.1 perseant ATF_CHECK_MSG((fabs((log10(e2) - (double)log10e2)/(double)log10e2) <
284 1.15.2.1 perseant 2*DBL_EPSILON),
285 1.15.2.1 perseant "log10(e^2)=%a=%.17g expected %a=%.17g",
286 1.15.2.1 perseant log10(e2), log10(e2), (double)log10e2, (double)log10e2);
287 1.15.2.1 perseant ATF_CHECK_MSG((fabsl((log10l(e2) - log10e2)/log10e2) < 2*LDBL_EPSILON),
288 1.15.2.1 perseant "log10l(e^2)=%La=%.34Lg expected %La=%.34Lg",
289 1.15.2.1 perseant log10l(e2), log10l(e2), log10e2, log10e2);
290 1.3 jruoho }
291 1.3 jruoho
292 1.15.2.1 perseant ATF_TC(log10_inf);
293 1.15.2.1 perseant ATF_TC_HEAD(log10_inf, tc)
294 1.3 jruoho {
295 1.15.2.1 perseant atf_tc_set_md_var(tc, "descr", "Test log10/f/l on +infinity");
296 1.3 jruoho }
297 1.15.2.1 perseant ATF_TC_BODY(log10_inf, tc)
298 1.3 jruoho {
299 1.3 jruoho
300 1.15.2.1 perseant if (!isinf(INFINITY))
301 1.15.2.1 perseant atf_tc_skip("no infinities on this architecture");
302 1.3 jruoho
303 1.15.2.1 perseant CHECK_EQ(0, log10f, INFINITY, INFINITY);
304 1.15.2.1 perseant CHECK_EQ(0, log10, INFINITY, INFINITY);
305 1.15.2.1 perseant CHECKL_EQ(0, log10l, INFINITY, INFINITY);
306 1.3 jruoho }
307 1.3 jruoho
308 1.3 jruoho /*
309 1.3 jruoho * log1p(3)
310 1.3 jruoho */
311 1.3 jruoho
312 1.15.2.1 perseant ATF_TC(log1p_invalid);
313 1.15.2.1 perseant ATF_TC_HEAD(log1p_invalid, tc)
314 1.3 jruoho {
315 1.15.2.1 perseant atf_tc_set_md_var(tc, "descr", "Test log1p/f/l on invalid inputs");
316 1.3 jruoho }
317 1.15.2.1 perseant ATF_TC_BODY(log1p_invalid, tc)
318 1.3 jruoho {
319 1.15.2.1 perseant unsigned i;
320 1.3 jruoho
321 1.15.2.1 perseant for (i = 0; i < __arraycount(log1pf_invalid); i++) {
322 1.15.2.1 perseant CHECK_NAN(i, log1pf, log1pf_invalid[i]);
323 1.15.2.1 perseant CHECK_NAN(i, log1p, log1pf_invalid[i]);
324 1.15.2.1 perseant CHECKL_NAN(i, log1pl, log1pf_invalid[i]);
325 1.15.2.1 perseant }
326 1.3 jruoho
327 1.15.2.1 perseant for (i = 0; i < __arraycount(log1p_invalid); i++) {
328 1.15.2.1 perseant CHECK_NAN(i, log1p, log1p_invalid[i]);
329 1.15.2.1 perseant CHECKL_NAN(i, log1pl, log1p_invalid[i]);
330 1.15.2.1 perseant }
331 1.3 jruoho
332 1.15.2.1 perseant for (i = 0; i < __arraycount(log1pl_invalid); i++) {
333 1.15.2.1 perseant CHECKL_NAN(i, log1pl, log1pl_invalid[i]);
334 1.15.2.1 perseant }
335 1.3 jruoho }
336 1.3 jruoho
337 1.15.2.1 perseant ATF_TC(log1p_neg_one);
338 1.15.2.1 perseant ATF_TC_HEAD(log1p_neg_one, tc)
339 1.3 jruoho {
340 1.15.2.1 perseant atf_tc_set_md_var(tc, "descr", "Test log1p/f/l on -1");
341 1.3 jruoho }
342 1.15.2.1 perseant ATF_TC_BODY(log1p_neg_one, tc)
343 1.3 jruoho {
344 1.3 jruoho
345 1.15.2.1 perseant CHECK_EQ(0, log1pf, -1., -HUGE_VALF);
346 1.15.2.1 perseant CHECK_EQ(0, log1p, -1., -HUGE_VAL);
347 1.15.2.1 perseant CHECKL_EQ(0, log1pl, -1., -HUGE_VALL);
348 1.3 jruoho }
349 1.3 jruoho
350 1.15.2.1 perseant ATF_TC(log1p_exact);
351 1.15.2.1 perseant ATF_TC_HEAD(log1p_exact, tc)
352 1.3 jruoho {
353 1.15.2.1 perseant atf_tc_set_md_var(tc, "descr", "Test log1p/f/l exact cases");
354 1.3 jruoho }
355 1.15.2.1 perseant ATF_TC_BODY(log1p_exact, tc)
356 1.3 jruoho {
357 1.3 jruoho
358 1.15.2.1 perseant CHECK_EQ(0, log1pf, -FLT_MIN, -FLT_MIN);
359 1.15.2.1 perseant CHECK_EQ(0, log1p, -DBL_MIN, -DBL_MIN);
360 1.15.2.1 perseant CHECKL_EQ(01, log1pl, -LDBL_MIN, -LDBL_MIN);
361 1.3 jruoho
362 1.15.2.1 perseant CHECK_EQ(1, log1pf, -0., 0);
363 1.15.2.1 perseant CHECK_EQ(1, log1p, -0., 0);
364 1.15.2.1 perseant CHECKL_EQ(1, log1pl, -0., 0);
365 1.3 jruoho
366 1.15.2.1 perseant CHECK_EQ(2, log1pf, +0., 0);
367 1.15.2.1 perseant CHECK_EQ(2, log1p, +0., 0);
368 1.15.2.1 perseant CHECKL_EQ(2, log1pl, +0., 0);
369 1.3 jruoho
370 1.15.2.1 perseant #ifdef __i386__
371 1.15.2.1 perseant atf_tc_expect_fail("PR port-i386/58434: single-float functions"
372 1.15.2.1 perseant " sometimes return surprisingly much precision");
373 1.15.2.1 perseant #endif
374 1.15.2.1 perseant CHECK_EQ(3, log1pf, 1, logf(2));
375 1.15.2.1 perseant #ifdef __i386__
376 1.15.2.1 perseant atf_tc_expect_pass();
377 1.15.2.1 perseant #endif
378 1.15.2.1 perseant CHECK_EQ(3, log1p, 1, log(2));
379 1.15.2.1 perseant CHECKL_EQ(3, log1pl, 1, logl(2));
380 1.3 jruoho }
381 1.3 jruoho
382 1.15.2.1 perseant ATF_TC(log1p_approx);
383 1.15.2.1 perseant ATF_TC_HEAD(log1p_approx, tc)
384 1.3 jruoho {
385 1.15.2.1 perseant atf_tc_set_md_var(tc, "descr", "Test log1p/f/l approximate cases");
386 1.3 jruoho }
387 1.15.2.1 perseant ATF_TC_BODY(log1p_approx, tc)
388 1.3 jruoho {
389 1.15.2.1 perseant volatile long double em1 = /* exp(1) - 1 */
390 1.15.2.1 perseant 1.7182818284590452353602874713526624977572470937L;
391 1.15.2.1 perseant volatile long double e2m1 = /* exp(2) - 1 */
392 1.15.2.1 perseant 6.3890560989306502272304274605750078131803155705519L;
393 1.3 jruoho
394 1.15.2.1 perseant /*
395 1.15.2.1 perseant * Approximation is close enough that equality of the rounded
396 1.15.2.1 perseant * output had better hold.
397 1.15.2.1 perseant */
398 1.15.2.1 perseant #ifdef FLT_DENORM_MIN
399 1.15.2.1 perseant CHECK_EQ(0, log1pf, -FLT_DENORM_MIN, -FLT_DENORM_MIN);
400 1.15.2.1 perseant #endif
401 1.15.2.1 perseant #ifdef DBL_DENORM_MIN
402 1.15.2.1 perseant CHECK_EQ(0, log1p, -DBL_DENORM_MIN, -DBL_DENORM_MIN);
403 1.15.2.1 perseant #endif
404 1.15.2.1 perseant #ifdef LDBL_DENORM_MIN
405 1.15.2.1 perseant CHECKL_EQ(0, log1pl, -LDBL_DENORM_MIN, -LDBL_DENORM_MIN);
406 1.15.2.1 perseant #endif
407 1.3 jruoho
408 1.15.2.1 perseant ATF_CHECK_MSG(fabsf((log1pf(em1) - 1)/1) < 2*FLT_EPSILON,
409 1.15.2.1 perseant "log1pf(e)=%a=%.8g", log1pf(em1), log1pf(em1));
410 1.15.2.1 perseant ATF_CHECK_MSG(fabs((log1p(em1) - 1)/1) < 2*DBL_EPSILON,
411 1.15.2.1 perseant "log1p(e)=%a=%.17g", log1p(em1), log1p(em1));
412 1.15.2.1 perseant ATF_CHECK_MSG(fabsl((log1pl(em1) - 1)/1) < 2*LDBL_EPSILON,
413 1.15.2.1 perseant "log1pl(e)=%La=%.34Lg", log1pl(em1), log1pl(em1));
414 1.3 jruoho
415 1.15.2.1 perseant ATF_CHECK_MSG(fabsf((log1pf(e2m1) - 2)/2) < 2*FLT_EPSILON,
416 1.15.2.1 perseant "log1pf(e^2)=%a=%.8g", log1pf(em1), log1pf(em1));
417 1.15.2.1 perseant ATF_CHECK_MSG(fabs((log1p(e2m1) - 2)/2) < 2*DBL_EPSILON,
418 1.15.2.1 perseant "log1p(e^2)=%a=%.17g", log1p(em1), log1p(em1));
419 1.15.2.1 perseant ATF_CHECK_MSG(fabsl((log1pl(e2m1) - 2)/2) < 2*LDBL_EPSILON,
420 1.15.2.1 perseant "log1pl(e^2)=%La=%.34Lg", log1pl(em1), log1pl(em1));
421 1.3 jruoho }
422 1.3 jruoho
423 1.15.2.1 perseant ATF_TC(log1p_inf);
424 1.15.2.1 perseant ATF_TC_HEAD(log1p_inf, tc)
425 1.3 jruoho {
426 1.15.2.1 perseant atf_tc_set_md_var(tc, "descr", "Test log1p/f/l on +infinity");
427 1.3 jruoho }
428 1.15.2.1 perseant ATF_TC_BODY(log1p_inf, tc)
429 1.3 jruoho {
430 1.3 jruoho
431 1.15.2.1 perseant if (!isinf(INFINITY))
432 1.15.2.1 perseant atf_tc_skip("no infinities on this architecture");
433 1.3 jruoho
434 1.15.2.1 perseant CHECK_EQ(0, log1pf, INFINITY, INFINITY);
435 1.15.2.1 perseant CHECK_EQ(0, log1p, INFINITY, INFINITY);
436 1.15.2.1 perseant CHECKL_EQ(0, log1pl, INFINITY, INFINITY);
437 1.3 jruoho }
438 1.3 jruoho
439 1.3 jruoho /*
440 1.3 jruoho * log2(3)
441 1.3 jruoho */
442 1.15.2.1 perseant static const struct {
443 1.15.2.1 perseant float x, y;
444 1.15.2.1 perseant } log2f_exact[] = {
445 1.15.2.1 perseant #ifdef FLT_DENORM_MIN
446 1.15.2.1 perseant { FLT_DENORM_MIN, FLT_MIN_EXP - FLT_MANT_DIG },
447 1.15.2.1 perseant #endif
448 1.15.2.1 perseant { FLT_MIN, FLT_MIN_EXP - 1 },
449 1.15.2.1 perseant { 0.25, -2 },
450 1.15.2.1 perseant { 0.5, -1 },
451 1.15.2.1 perseant { 1, 0 },
452 1.15.2.1 perseant { 2, 1 },
453 1.15.2.1 perseant { 4, 2 },
454 1.15.2.1 perseant { 8, 3 },
455 1.15.2.1 perseant { 1 << FLT_MANT_DIG, FLT_MANT_DIG },
456 1.15.2.1 perseant { (float)(1 << FLT_MANT_DIG) * (1 << FLT_MANT_DIG),
457 1.15.2.1 perseant 2*FLT_MANT_DIG },
458 1.15.2.1 perseant };
459 1.15.2.1 perseant static const struct {
460 1.15.2.1 perseant double x, y;
461 1.15.2.1 perseant } log2_exact[] = {
462 1.15.2.1 perseant #ifdef DBL_DENORM_MIN
463 1.15.2.1 perseant { DBL_DENORM_MIN, DBL_MIN_EXP - DBL_MANT_DIG },
464 1.15.2.1 perseant #endif
465 1.15.2.1 perseant { DBL_MIN, DBL_MIN_EXP - 1 },
466 1.15.2.1 perseant { (uint64_t)1 << DBL_MANT_DIG, DBL_MANT_DIG },
467 1.15.2.1 perseant { ((double)((uint64_t)1 << DBL_MANT_DIG) *
468 1.15.2.1 perseant ((uint64_t)1 << DBL_MANT_DIG)),
469 1.15.2.1 perseant 2*DBL_MANT_DIG },
470 1.15.2.1 perseant };
471 1.15.2.1 perseant
472 1.15.2.1 perseant static const struct {
473 1.15.2.1 perseant long double x, y;
474 1.15.2.1 perseant } log2l_exact[] = {
475 1.15.2.1 perseant #ifdef LDBL_DENORM_MIN
476 1.15.2.1 perseant { LDBL_DENORM_MIN, LDBL_MIN_EXP - LDBL_MANT_DIG },
477 1.15.2.1 perseant #endif
478 1.15.2.1 perseant { LDBL_MIN, LDBL_MIN_EXP - 1 },
479 1.15.2.1 perseant { ((long double)((uint64_t)1 << (LDBL_MANT_DIG/2)) *
480 1.15.2.1 perseant ((uint64_t)1 << ((LDBL_MANT_DIG + 1)/2))),
481 1.15.2.1 perseant LDBL_MANT_DIG },
482 1.15.2.1 perseant { (((long double)((uint64_t)1 << (LDBL_MANT_DIG/2)) *
483 1.15.2.1 perseant ((uint64_t)1 << ((LDBL_MANT_DIG + 1)/2))) *
484 1.15.2.1 perseant ((long double)((uint64_t)1 << (LDBL_MANT_DIG/2)) *
485 1.15.2.1 perseant ((uint64_t)1 << ((LDBL_MANT_DIG + 1)/2)))),
486 1.15.2.1 perseant 2*LDBL_MANT_DIG },
487 1.15.2.1 perseant };
488 1.15.2.1 perseant
489 1.15.2.1 perseant ATF_TC(log2_invalid);
490 1.15.2.1 perseant ATF_TC_HEAD(log2_invalid, tc)
491 1.15.2.1 perseant {
492 1.15.2.1 perseant atf_tc_set_md_var(tc, "descr", "Test log2/f/l on invalid inputs");
493 1.15.2.1 perseant }
494 1.15.2.1 perseant ATF_TC_BODY(log2_invalid, tc)
495 1.15.2.1 perseant {
496 1.15.2.1 perseant unsigned i;
497 1.15.2.1 perseant
498 1.15.2.1 perseant for (i = 0; i < __arraycount(logf_invalid); i++) {
499 1.15.2.1 perseant CHECK_NAN(i, log2f, logf_invalid[i]);
500 1.15.2.1 perseant CHECK_NAN(i, log2, logf_invalid[i]);
501 1.15.2.1 perseant CHECKL_NAN(i, log2l, logf_invalid[i]);
502 1.15.2.1 perseant }
503 1.15.2.1 perseant
504 1.15.2.1 perseant for (i = 0; i < __arraycount(log_invalid); i++) {
505 1.15.2.1 perseant CHECK_NAN(i, log2, log_invalid[i]);
506 1.15.2.1 perseant CHECKL_NAN(i, log2l, log_invalid[i]);
507 1.15.2.1 perseant }
508 1.15.2.1 perseant
509 1.15.2.1 perseant for (i = 0; i < __arraycount(logl_invalid); i++) {
510 1.15.2.1 perseant CHECKL_NAN(i, log2l, logl_invalid[i]);
511 1.15.2.1 perseant }
512 1.15.2.1 perseant }
513 1.15.2.1 perseant
514 1.15.2.1 perseant ATF_TC(log2_zero);
515 1.15.2.1 perseant ATF_TC_HEAD(log2_zero, tc)
516 1.15.2.1 perseant {
517 1.15.2.1 perseant atf_tc_set_md_var(tc, "descr", "Test log2/f/l on zero");
518 1.15.2.1 perseant }
519 1.15.2.1 perseant ATF_TC_BODY(log2_zero, tc)
520 1.15.2.1 perseant {
521 1.15.2.1 perseant
522 1.15.2.1 perseant CHECK_EQ(0, log2f, +0., -HUGE_VALF);
523 1.15.2.1 perseant CHECK_EQ(0, log2, +0., -HUGE_VAL);
524 1.15.2.1 perseant CHECKL_EQ(0, log2l, +0., -HUGE_VALL);
525 1.15.2.1 perseant
526 1.15.2.1 perseant CHECK_EQ(1, log2f, -0., -HUGE_VALF);
527 1.15.2.1 perseant CHECK_EQ(1, log2, -0., -HUGE_VAL);
528 1.15.2.1 perseant CHECKL_EQ(1, log2l, -0., -HUGE_VALL);
529 1.15.2.1 perseant }
530 1.15.2.1 perseant
531 1.15.2.1 perseant ATF_TC(log2_exact);
532 1.15.2.1 perseant ATF_TC_HEAD(log2_exact, tc)
533 1.15.2.1 perseant {
534 1.15.2.1 perseant atf_tc_set_md_var(tc, "descr", "Test log2/f/l exact cases");
535 1.15.2.1 perseant }
536 1.15.2.1 perseant ATF_TC_BODY(log2_exact, tc)
537 1.15.2.1 perseant {
538 1.15.2.1 perseant unsigned i;
539 1.15.2.1 perseant
540 1.15.2.1 perseant ATF_CHECK_EQ(signbit(log2f(1)), 0);
541 1.15.2.1 perseant ATF_CHECK_EQ(signbit(log2(1)), 0);
542 1.15.2.1 perseant ATF_CHECK_EQ(signbit(log2l(1)), 0);
543 1.15.2.1 perseant
544 1.15.2.1 perseant for (i = 0; i < __arraycount(log2f_exact); i++) {
545 1.15.2.1 perseant const float x = log2f_exact[i].x;
546 1.15.2.1 perseant const float y = log2f_exact[i].y;
547 1.15.2.1 perseant
548 1.15.2.1 perseant CHECK_EQ(i, log2f, x, y);
549 1.15.2.1 perseant CHECK_EQ(i, log2, x, y);
550 1.15.2.1 perseant CHECKL_EQ(i, log2l, x, y);
551 1.15.2.1 perseant }
552 1.15.2.1 perseant
553 1.15.2.1 perseant for (i = 0; i < __arraycount(log2_exact); i++) {
554 1.15.2.1 perseant const double x = log2_exact[i].x;
555 1.15.2.1 perseant const double y = log2_exact[i].y;
556 1.15.2.1 perseant
557 1.15.2.1 perseant CHECK_EQ(i, log2, x, y);
558 1.15.2.1 perseant CHECKL_EQ(i, log2l, x, y);
559 1.15.2.1 perseant }
560 1.15.2.1 perseant
561 1.15.2.1 perseant for (i = 0; i < __arraycount(log2l_exact); i++) {
562 1.15.2.1 perseant const long double x = log2l_exact[i].x;
563 1.15.2.1 perseant const long double y = log2l_exact[i].y;
564 1.15.2.1 perseant
565 1.15.2.1 perseant CHECKL_EQ(i, log2l, x, y);
566 1.15.2.1 perseant }
567 1.15.2.1 perseant }
568 1.15.2.1 perseant
569 1.15.2.1 perseant ATF_TC(log2_approx);
570 1.15.2.1 perseant ATF_TC_HEAD(log2_approx, tc)
571 1.15.2.1 perseant {
572 1.15.2.1 perseant atf_tc_set_md_var(tc, "descr", "Test log2/f/l approximate cases");
573 1.15.2.1 perseant }
574 1.15.2.1 perseant ATF_TC_BODY(log2_approx, tc)
575 1.15.2.1 perseant {
576 1.15.2.1 perseant volatile long double e =
577 1.15.2.1 perseant 2.7182818284590452353602874713526624977572470937L;
578 1.15.2.1 perseant volatile long double e2 =
579 1.15.2.1 perseant 7.3890560989306502272304274605750078131803155705519L;
580 1.15.2.1 perseant volatile long double log2e =
581 1.15.2.1 perseant 1.442695040888963407359924681001892137426645954153L;
582 1.15.2.1 perseant volatile long double log2e2 =
583 1.15.2.1 perseant 2*1.442695040888963407359924681001892137426645954153L;
584 1.15.2.1 perseant
585 1.15.2.1 perseant ATF_CHECK_MSG((fabsf((log2f(e) - (float)log2e)/(float)log2e) <
586 1.15.2.1 perseant 2*FLT_EPSILON),
587 1.15.2.1 perseant "log2f(e)=%a=%.8g expected %a=%.8g",
588 1.15.2.1 perseant log2f(e), log2f(e), (float)log2e, (float)log2e);
589 1.15.2.1 perseant ATF_CHECK_MSG((fabs((log2(e) - (double)log2e)/(double)log2e) <
590 1.15.2.1 perseant 2*DBL_EPSILON),
591 1.15.2.1 perseant "log2(e)=%a=%.17g expected %a=%.17g",
592 1.15.2.1 perseant log2(e), log2(e), (double)log2e, (double)log2e);
593 1.15.2.1 perseant ATF_CHECK_MSG((fabsl((log2l(e) - log2e)/log2e) < 2*LDBL_EPSILON),
594 1.15.2.1 perseant "log2l(e)=%La=%.34Lg expected %La=%.34Lg",
595 1.15.2.1 perseant log2l(e), log2l(e), log2e, log2e);
596 1.15.2.1 perseant
597 1.15.2.1 perseant ATF_CHECK_MSG((fabsf((log2f(e2) - (float)log2e2)/(float)log2e2) <
598 1.15.2.1 perseant 2*FLT_EPSILON),
599 1.15.2.1 perseant "log2f(e^2)=%a=%.8g expected %a=%.8g",
600 1.15.2.1 perseant log2f(e2), log2f(e2), (float)log2e2, (float)log2e2);
601 1.15.2.1 perseant ATF_CHECK_MSG((fabs((log2(e2) - (double)log2e2)/(double)log2e2) <
602 1.15.2.1 perseant 2*DBL_EPSILON),
603 1.15.2.1 perseant "log2(e^2)=%a=%.17g expected %a=%.17g",
604 1.15.2.1 perseant log2(e2), log2(e2), (double)log2e2, (double)log2e2);
605 1.15.2.1 perseant ATF_CHECK_MSG((fabsl((log2l(e2) - log2e2)/log2e2) < 2*LDBL_EPSILON),
606 1.15.2.1 perseant "log2l(e^2)=%La=%.34Lg expected %La=%.34Lg",
607 1.15.2.1 perseant log2l(e2), log2l(e2), log2e2, log2e2);
608 1.15.2.1 perseant }
609 1.15.2.1 perseant
610 1.15.2.1 perseant ATF_TC(log2_inf);
611 1.15.2.1 perseant ATF_TC_HEAD(log2_inf, tc)
612 1.15.2.1 perseant {
613 1.15.2.1 perseant atf_tc_set_md_var(tc, "descr", "Test log2/f/l on +infinity");
614 1.15.2.1 perseant }
615 1.15.2.1 perseant ATF_TC_BODY(log2_inf, tc)
616 1.15.2.1 perseant {
617 1.15.2.1 perseant
618 1.15.2.1 perseant if (!isinf(INFINITY))
619 1.15.2.1 perseant atf_tc_skip("no infinities on this architecture");
620 1.15.2.1 perseant
621 1.15.2.1 perseant CHECK_EQ(0, log2f, INFINITY, INFINITY);
622 1.15.2.1 perseant CHECK_EQ(0, log2, INFINITY, INFINITY);
623 1.15.2.1 perseant CHECKL_EQ(0, log2l, INFINITY, INFINITY);
624 1.3 jruoho }
625 1.1 jruoho
626 1.3 jruoho /*
627 1.3 jruoho * log(3)
628 1.3 jruoho */
629 1.3 jruoho
630 1.15.2.1 perseant ATF_TC(log_invalid);
631 1.15.2.1 perseant ATF_TC_HEAD(log_invalid, tc)
632 1.3 jruoho {
633 1.15.2.1 perseant atf_tc_set_md_var(tc, "descr", "Test log/f/l on invalid inputs");
634 1.3 jruoho }
635 1.15.2.1 perseant ATF_TC_BODY(log_invalid, tc)
636 1.3 jruoho {
637 1.15.2.1 perseant unsigned i;
638 1.1 jruoho
639 1.15.2.1 perseant for (i = 0; i < __arraycount(logf_invalid); i++) {
640 1.15.2.1 perseant CHECK_NAN(i, logf, logf_invalid[i]);
641 1.15.2.1 perseant CHECK_NAN(i, log, logf_invalid[i]);
642 1.15.2.1 perseant CHECKL_NAN(i, logl, logf_invalid[i]);
643 1.15.2.1 perseant }
644 1.1 jruoho
645 1.15.2.1 perseant for (i = 0; i < __arraycount(log_invalid); i++) {
646 1.15.2.1 perseant CHECK_NAN(i, log, log_invalid[i]);
647 1.15.2.1 perseant CHECKL_NAN(i, logl, log_invalid[i]);
648 1.15.2.1 perseant }
649 1.3 jruoho
650 1.15.2.1 perseant for (i = 0; i < __arraycount(logl_invalid); i++) {
651 1.15.2.1 perseant CHECKL_NAN(i, logl, logl_invalid[i]);
652 1.15.2.1 perseant }
653 1.3 jruoho }
654 1.3 jruoho
655 1.15.2.1 perseant ATF_TC(log_zero);
656 1.15.2.1 perseant ATF_TC_HEAD(log_zero, tc)
657 1.3 jruoho {
658 1.15.2.1 perseant atf_tc_set_md_var(tc, "descr", "Test log/f/l on zero");
659 1.3 jruoho }
660 1.15.2.1 perseant ATF_TC_BODY(log_zero, tc)
661 1.5 jruoho {
662 1.5 jruoho
663 1.15.2.1 perseant CHECK_EQ(0, logf, +0., -HUGE_VALF);
664 1.15.2.1 perseant CHECK_EQ(0, log, +0., -HUGE_VAL);
665 1.15.2.1 perseant CHECKL_EQ(0, logl, +0., -HUGE_VALL);
666 1.5 jruoho
667 1.15.2.1 perseant CHECK_EQ(1, logf, -0., -HUGE_VALF);
668 1.15.2.1 perseant CHECK_EQ(1, log, -0., -HUGE_VAL);
669 1.15.2.1 perseant CHECKL_EQ(1, logl, -0., -HUGE_VALL);
670 1.5 jruoho }
671 1.5 jruoho
672 1.15.2.1 perseant ATF_TC(log_exact);
673 1.15.2.1 perseant ATF_TC_HEAD(log_exact, tc)
674 1.3 jruoho {
675 1.15.2.1 perseant atf_tc_set_md_var(tc, "descr", "Test log/f/l exact cases");
676 1.3 jruoho }
677 1.15.2.1 perseant ATF_TC_BODY(log_exact, tc)
678 1.3 jruoho {
679 1.3 jruoho
680 1.15.2.1 perseant CHECK_EQ(0, logf, 1, 0);
681 1.15.2.1 perseant CHECK_EQ(0, log, 1, 0);
682 1.15.2.1 perseant CHECKL_EQ(0, logl, 1, 0);
683 1.3 jruoho
684 1.15.2.1 perseant ATF_CHECK_EQ(signbit(logf(1)), 0);
685 1.15.2.1 perseant ATF_CHECK_EQ(signbit(log(1)), 0);
686 1.15.2.1 perseant ATF_CHECK_EQ(signbit(logl(1)), 0);
687 1.3 jruoho }
688 1.3 jruoho
689 1.15.2.1 perseant ATF_TC(log_approx);
690 1.15.2.1 perseant ATF_TC_HEAD(log_approx, tc)
691 1.3 jruoho {
692 1.15.2.1 perseant atf_tc_set_md_var(tc, "descr", "Test log/f/l approximate cases");
693 1.3 jruoho }
694 1.15.2.1 perseant ATF_TC_BODY(log_approx, tc)
695 1.3 jruoho {
696 1.15.2.1 perseant volatile long double e =
697 1.15.2.1 perseant 2.7182818284590452353602874713526624977572470937L;
698 1.15.2.1 perseant volatile long double e2 =
699 1.15.2.1 perseant 7.3890560989306502272304274605750078131803155705519L;
700 1.15.2.1 perseant volatile long double log_2 =
701 1.15.2.1 perseant 0.69314718055994530941723212145817656807550013436025L;
702 1.15.2.1 perseant volatile long double log_10 =
703 1.15.2.1 perseant 2.30258509299404568401799145468436420760110148862875L;
704 1.3 jruoho
705 1.15.2.1 perseant ATF_CHECK_MSG(fabsf((logf(2) - log_2)/log_2) < 2*FLT_EPSILON,
706 1.15.2.1 perseant "logf(2)=%a=%.8g expected %a=%.8g",
707 1.15.2.1 perseant logf(2), logf(2), (float)log_2, (float)log_2);
708 1.15.2.1 perseant ATF_CHECK_MSG(fabs((log(2) - log_2)/log_2) < 2*DBL_EPSILON,
709 1.15.2.1 perseant "log(2)=%a=%.17g expected %a=%.17g",
710 1.15.2.1 perseant log(2), log(2), (double)log_2, (double)log_2);
711 1.15.2.1 perseant ATF_CHECK_MSG(fabsl((logl(2) - log_2)/log_2) < 2*LDBL_EPSILON,
712 1.15.2.1 perseant "logl(2)=%La=%.34Lg expected %La=%.34Lg",
713 1.15.2.1 perseant logl(2), logl(2), log_2, log_2);
714 1.3 jruoho
715 1.15.2.1 perseant ATF_CHECK_MSG(fabsf((logf(e) - 1)/1) < 2*FLT_EPSILON,
716 1.15.2.1 perseant "logf(e)=%a=%.8g", logf(e), logf(e));
717 1.15.2.1 perseant ATF_CHECK_MSG(fabs((log(e) - 1)/1) < 2*DBL_EPSILON,
718 1.15.2.1 perseant "log(e)=%a=%.17g", log(e), log(e));
719 1.15.2.1 perseant ATF_CHECK_MSG(fabsl((logl(e) - 1)/1) < 2*LDBL_EPSILON,
720 1.15.2.1 perseant "logl(e)=%La=%.34Lg", logl(e), logl(e));
721 1.3 jruoho
722 1.15.2.1 perseant ATF_CHECK_MSG(fabsf((logf(e2) - 2)/2) < 2*FLT_EPSILON,
723 1.15.2.1 perseant "logf(e)=%a=%.8g", logf(e2), logf(e2));
724 1.15.2.1 perseant ATF_CHECK_MSG(fabs((log(e2) - 2)/2) < 2*DBL_EPSILON,
725 1.15.2.1 perseant "log(e)=%a=%.17g", log(e2), log(e2));
726 1.15.2.1 perseant ATF_CHECK_MSG(fabsl((logl(e2) - 2)/2) < 2*LDBL_EPSILON,
727 1.15.2.1 perseant "logl(e)=%La=%.34Lg", logl(e2), logl(e2));
728 1.3 jruoho
729 1.15.2.1 perseant ATF_CHECK_MSG(fabsf((logf(10) - log_10)/log_10) < 2*FLT_EPSILON,
730 1.15.2.1 perseant "logf(10)=%a=%.8g expected %a=%.8g",
731 1.15.2.1 perseant logf(10), logf(10), (float)log_10, (float)log_10);
732 1.15.2.1 perseant ATF_CHECK_MSG(fabs((log(10) - log_10)/log_10) < 2*DBL_EPSILON,
733 1.15.2.1 perseant "log(10)=%a=%.17g expected %a=%.17g",
734 1.15.2.1 perseant log(10), log(10), (double)log_10, (double)log_10);
735 1.15.2.1 perseant ATF_CHECK_MSG(fabsl((logl(10) - log_10)/log_10) < 2*LDBL_EPSILON,
736 1.15.2.1 perseant "logl(10)=%La=%.34Lg expected %La=%.34Lg",
737 1.15.2.1 perseant logl(10), logl(10), log_10, log_10);
738 1.3 jruoho }
739 1.3 jruoho
740 1.15.2.1 perseant ATF_TC(log_inf);
741 1.15.2.1 perseant ATF_TC_HEAD(log_inf, tc)
742 1.3 jruoho {
743 1.15.2.1 perseant atf_tc_set_md_var(tc, "descr", "Test log/f/l on +infinity");
744 1.3 jruoho }
745 1.15.2.1 perseant ATF_TC_BODY(log_inf, tc)
746 1.3 jruoho {
747 1.3 jruoho
748 1.15.2.1 perseant if (!isinf(INFINITY))
749 1.15.2.1 perseant atf_tc_skip("no infinities on this architecture");
750 1.3 jruoho
751 1.15.2.1 perseant CHECK_EQ(0, logf, INFINITY, INFINITY);
752 1.15.2.1 perseant CHECK_EQ(0, log, INFINITY, INFINITY);
753 1.15.2.1 perseant CHECKL_EQ(0, logl, INFINITY, INFINITY);
754 1.1 jruoho }
755 1.1 jruoho
756 1.1 jruoho ATF_TP_ADD_TCS(tp)
757 1.1 jruoho {
758 1.1 jruoho
759 1.15.2.1 perseant ATF_TP_ADD_TC(tp, log10_invalid);
760 1.15.2.1 perseant ATF_TP_ADD_TC(tp, log10_zero);
761 1.15.2.1 perseant ATF_TP_ADD_TC(tp, log10_exact);
762 1.15.2.1 perseant ATF_TP_ADD_TC(tp, log10_approx);
763 1.15.2.1 perseant ATF_TP_ADD_TC(tp, log10_inf);
764 1.15.2.1 perseant
765 1.15.2.1 perseant ATF_TP_ADD_TC(tp, log1p_invalid);
766 1.15.2.1 perseant ATF_TP_ADD_TC(tp, log1p_neg_one);
767 1.15.2.1 perseant ATF_TP_ADD_TC(tp, log1p_exact);
768 1.15.2.1 perseant ATF_TP_ADD_TC(tp, log1p_approx);
769 1.15.2.1 perseant ATF_TP_ADD_TC(tp, log1p_inf);
770 1.15.2.1 perseant
771 1.15.2.1 perseant ATF_TP_ADD_TC(tp, log2_invalid);
772 1.15.2.1 perseant ATF_TP_ADD_TC(tp, log2_zero);
773 1.15.2.1 perseant ATF_TP_ADD_TC(tp, log2_exact);
774 1.15.2.1 perseant ATF_TP_ADD_TC(tp, log2_approx);
775 1.15.2.1 perseant ATF_TP_ADD_TC(tp, log2_inf);
776 1.15.2.1 perseant
777 1.15.2.1 perseant ATF_TP_ADD_TC(tp, log_invalid);
778 1.15.2.1 perseant ATF_TP_ADD_TC(tp, log_zero);
779 1.15.2.1 perseant ATF_TP_ADD_TC(tp, log_exact);
780 1.15.2.1 perseant ATF_TP_ADD_TC(tp, log_approx);
781 1.15.2.1 perseant ATF_TP_ADD_TC(tp, log_inf);
782 1.1 jruoho
783 1.1 jruoho return atf_no_error();
784 1.1 jruoho }
785