t_log.c revision 276478
1/* $NetBSD: t_log.c,v 1.12 2014/11/04 00:20:19 justin Exp $ */
2
3/*-
4 * Copyright (c) 2011 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Jukka Ruohonen.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 *    notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in the
17 *    documentation and/or other materials provided with the distribution.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31#include <sys/cdefs.h>
32__RCSID("$NetBSD: t_log.c,v 1.12 2014/11/04 00:20:19 justin Exp $");
33
34#include <atf-c.h>
35
36#include <math.h>
37#include <stdio.h>
38#include <string.h>
39
40/*
41 * log10(3)
42 */
43ATF_TC(log10_base);
44ATF_TC_HEAD(log10_base, tc)
45{
46	atf_tc_set_md_var(tc, "descr", "Test log10(10) == 1");
47}
48
49ATF_TC_BODY(log10_base, tc)
50{
51	ATF_CHECK(log10(10.0) == 1.0);
52}
53
54ATF_TC(log10_nan);
55ATF_TC_HEAD(log10_nan, tc)
56{
57	atf_tc_set_md_var(tc, "descr", "Test log10(NaN) == NaN");
58}
59
60ATF_TC_BODY(log10_nan, tc)
61{
62	const double x = 0.0L / 0.0L;
63
64	ATF_CHECK(isnan(x) != 0);
65	ATF_CHECK(isnan(log10(x)) != 0);
66}
67
68ATF_TC(log10_inf_neg);
69ATF_TC_HEAD(log10_inf_neg, tc)
70{
71	atf_tc_set_md_var(tc, "descr", "Test log10(-Inf) == NaN");
72}
73
74ATF_TC_BODY(log10_inf_neg, tc)
75{
76	const double x = -1.0L / 0.0L;
77	const double y = log10(x);
78
79	ATF_CHECK(isnan(y) != 0);
80}
81
82ATF_TC(log10_inf_pos);
83ATF_TC_HEAD(log10_inf_pos, tc)
84{
85	atf_tc_set_md_var(tc, "descr", "Test log10(+Inf) == +Inf");
86}
87
88ATF_TC_BODY(log10_inf_pos, tc)
89{
90	const double x = 1.0L / 0.0L;
91
92	ATF_CHECK(log10(x) == x);
93}
94
95ATF_TC(log10_one_pos);
96ATF_TC_HEAD(log10_one_pos, tc)
97{
98	atf_tc_set_md_var(tc, "descr", "Test log10(1.0) == +0.0");
99}
100
101ATF_TC_BODY(log10_one_pos, tc)
102{
103	const double x = log10(1.0);
104	const double y = 0.0L;
105
106	ATF_CHECK(x == y);
107	ATF_CHECK(signbit(x) == 0);
108	ATF_CHECK(signbit(y) == 0);
109}
110
111ATF_TC(log10_zero_neg);
112ATF_TC_HEAD(log10_zero_neg, tc)
113{
114	atf_tc_set_md_var(tc, "descr", "Test log10(-0.0) == -HUGE_VAL");
115}
116
117ATF_TC_BODY(log10_zero_neg, tc)
118{
119	const double x = -0.0L;
120
121	ATF_CHECK(log10(x) == -HUGE_VAL);
122}
123
124ATF_TC(log10_zero_pos);
125ATF_TC_HEAD(log10_zero_pos, tc)
126{
127	atf_tc_set_md_var(tc, "descr", "Test log10(+0.0) == -HUGE_VAL");
128}
129
130ATF_TC_BODY(log10_zero_pos, tc)
131{
132	const double x = 0.0L;
133
134	ATF_CHECK(log10(x) == -HUGE_VAL);
135}
136
137/*
138 * log10f(3)
139 */
140ATF_TC(log10f_base);
141ATF_TC_HEAD(log10f_base, tc)
142{
143	atf_tc_set_md_var(tc, "descr", "Test log10f(10) == 1");
144}
145
146ATF_TC_BODY(log10f_base, tc)
147{
148	ATF_CHECK(log10f(10.0) == 1.0);
149}
150
151ATF_TC(log10f_nan);
152ATF_TC_HEAD(log10f_nan, tc)
153{
154	atf_tc_set_md_var(tc, "descr", "Test log10f(NaN) == NaN");
155}
156
157ATF_TC_BODY(log10f_nan, tc)
158{
159	const float x = 0.0L / 0.0L;
160
161	ATF_CHECK(isnan(x) != 0);
162	ATF_CHECK(isnan(log10f(x)) != 0);
163}
164
165ATF_TC(log10f_inf_neg);
166ATF_TC_HEAD(log10f_inf_neg, tc)
167{
168	atf_tc_set_md_var(tc, "descr", "Test log10f(-Inf) == NaN");
169}
170
171ATF_TC_BODY(log10f_inf_neg, tc)
172{
173	const float x = -1.0L / 0.0L;
174	const float y = log10f(x);
175
176	ATF_CHECK(isnan(y) != 0);
177}
178
179ATF_TC(log10f_inf_pos);
180ATF_TC_HEAD(log10f_inf_pos, tc)
181{
182	atf_tc_set_md_var(tc, "descr", "Test log10f(+Inf) == +Inf");
183}
184
185ATF_TC_BODY(log10f_inf_pos, tc)
186{
187	const float x = 1.0L / 0.0L;
188
189#if defined(__alpha__)
190	atf_tc_expect_fail("PR port-alpha/46301");
191#endif
192
193	ATF_CHECK(log10f(x) == x);
194}
195
196ATF_TC(log10f_one_pos);
197ATF_TC_HEAD(log10f_one_pos, tc)
198{
199	atf_tc_set_md_var(tc, "descr", "Test log10f(1.0) == +0.0");
200}
201
202ATF_TC_BODY(log10f_one_pos, tc)
203{
204	const float x = log10f(1.0);
205	const float y = 0.0L;
206
207	ATF_CHECK(x == y);
208	ATF_CHECK(signbit(x) == 0);
209	ATF_CHECK(signbit(y) == 0);
210}
211
212ATF_TC(log10f_zero_neg);
213ATF_TC_HEAD(log10f_zero_neg, tc)
214{
215	atf_tc_set_md_var(tc, "descr", "Test log10f(-0.0) == -HUGE_VALF");
216}
217
218ATF_TC_BODY(log10f_zero_neg, tc)
219{
220	const float x = -0.0L;
221
222	ATF_CHECK(log10f(x) == -HUGE_VALF);
223}
224
225ATF_TC(log10f_zero_pos);
226ATF_TC_HEAD(log10f_zero_pos, tc)
227{
228	atf_tc_set_md_var(tc, "descr", "Test log10f(+0.0) == -HUGE_VALF");
229}
230
231ATF_TC_BODY(log10f_zero_pos, tc)
232{
233	const float x = 0.0L;
234
235	ATF_CHECK(log10f(x) == -HUGE_VALF);
236}
237
238/*
239 * log1p(3)
240 */
241ATF_TC(log1p_nan);
242ATF_TC_HEAD(log1p_nan, tc)
243{
244	atf_tc_set_md_var(tc, "descr", "Test log1p(NaN) == NaN");
245}
246
247ATF_TC_BODY(log1p_nan, tc)
248{
249	const double x = 0.0L / 0.0L;
250
251	ATF_CHECK(isnan(x) != 0);
252	ATF_CHECK(isnan(log1p(x)) != 0);
253}
254
255ATF_TC(log1p_inf_neg);
256ATF_TC_HEAD(log1p_inf_neg, tc)
257{
258	atf_tc_set_md_var(tc, "descr", "Test log1p(-Inf) == NaN");
259}
260
261ATF_TC_BODY(log1p_inf_neg, tc)
262{
263	const double x = -1.0L / 0.0L;
264	const double y = log1p(x);
265
266	if (isnan(y) == 0) {
267		atf_tc_expect_fail("PR lib/45362");
268		atf_tc_fail("log1p(-Inf) != NaN");
269	}
270}
271
272ATF_TC(log1p_inf_pos);
273ATF_TC_HEAD(log1p_inf_pos, tc)
274{
275	atf_tc_set_md_var(tc, "descr", "Test log1p(+Inf) == +Inf");
276}
277
278ATF_TC_BODY(log1p_inf_pos, tc)
279{
280	const double x = 1.0L / 0.0L;
281
282	ATF_CHECK(log1p(x) == x);
283}
284
285ATF_TC(log1p_one_neg);
286ATF_TC_HEAD(log1p_one_neg, tc)
287{
288	atf_tc_set_md_var(tc, "descr", "Test log1p(-1.0) == -HUGE_VAL");
289}
290
291ATF_TC_BODY(log1p_one_neg, tc)
292{
293	const double x = log1p(-1.0);
294
295	if (x != -HUGE_VAL) {
296		atf_tc_expect_fail("PR lib/45362");
297		atf_tc_fail("log1p(-1.0) != -HUGE_VAL");
298	}
299}
300
301ATF_TC(log1p_zero_neg);
302ATF_TC_HEAD(log1p_zero_neg, tc)
303{
304	atf_tc_set_md_var(tc, "descr", "Test log1p(-0.0) == -0.0");
305}
306
307ATF_TC_BODY(log1p_zero_neg, tc)
308{
309	const double x = -0.0L;
310
311	ATF_CHECK(log1p(x) == x);
312}
313
314ATF_TC(log1p_zero_pos);
315ATF_TC_HEAD(log1p_zero_pos, tc)
316{
317	atf_tc_set_md_var(tc, "descr", "Test log1p(+0.0) == +0.0");
318}
319
320ATF_TC_BODY(log1p_zero_pos, tc)
321{
322	const double x = 0.0L;
323
324	ATF_CHECK(log1p(x) == x);
325}
326
327/*
328 * log1pf(3)
329 */
330ATF_TC(log1pf_nan);
331ATF_TC_HEAD(log1pf_nan, tc)
332{
333	atf_tc_set_md_var(tc, "descr", "Test log1pf(NaN) == NaN");
334}
335
336ATF_TC_BODY(log1pf_nan, tc)
337{
338	const float x = 0.0L / 0.0L;
339
340	ATF_CHECK(isnan(x) != 0);
341	ATF_CHECK(isnan(log1pf(x)) != 0);
342}
343
344ATF_TC(log1pf_inf_neg);
345ATF_TC_HEAD(log1pf_inf_neg, tc)
346{
347	atf_tc_set_md_var(tc, "descr", "Test log1pf(-Inf) == NaN");
348}
349
350ATF_TC_BODY(log1pf_inf_neg, tc)
351{
352	const float x = -1.0L / 0.0L;
353	const float y = log1pf(x);
354
355	if (isnan(y) == 0) {
356		atf_tc_expect_fail("PR lib/45362");
357		atf_tc_fail("log1pf(-Inf) != NaN");
358	}
359}
360
361ATF_TC(log1pf_inf_pos);
362ATF_TC_HEAD(log1pf_inf_pos, tc)
363{
364	atf_tc_set_md_var(tc, "descr", "Test log1pf(+Inf) == +Inf");
365}
366
367ATF_TC_BODY(log1pf_inf_pos, tc)
368{
369	const float x = 1.0L / 0.0L;
370
371	ATF_CHECK(log1pf(x) == x);
372}
373
374ATF_TC(log1pf_one_neg);
375ATF_TC_HEAD(log1pf_one_neg, tc)
376{
377	atf_tc_set_md_var(tc, "descr", "Test log1pf(-1.0) == -HUGE_VALF");
378}
379
380ATF_TC_BODY(log1pf_one_neg, tc)
381{
382	const float x = log1pf(-1.0);
383
384	if (x != -HUGE_VALF) {
385		atf_tc_expect_fail("PR lib/45362");
386		atf_tc_fail("log1pf(-1.0) != -HUGE_VALF");
387	}
388}
389
390ATF_TC(log1pf_zero_neg);
391ATF_TC_HEAD(log1pf_zero_neg, tc)
392{
393	atf_tc_set_md_var(tc, "descr", "Test log1pf(-0.0) == -0.0");
394}
395
396ATF_TC_BODY(log1pf_zero_neg, tc)
397{
398	const float x = -0.0L;
399
400	ATF_CHECK(log1pf(x) == x);
401}
402
403ATF_TC(log1pf_zero_pos);
404ATF_TC_HEAD(log1pf_zero_pos, tc)
405{
406	atf_tc_set_md_var(tc, "descr", "Test log1pf(+0.0) == +0.0");
407}
408
409ATF_TC_BODY(log1pf_zero_pos, tc)
410{
411	const float x = 0.0L;
412
413	ATF_CHECK(log1pf(x) == x);
414}
415
416/*
417 * log2(3)
418 */
419ATF_TC(log2_base);
420ATF_TC_HEAD(log2_base, tc)
421{
422	atf_tc_set_md_var(tc, "descr", "Test log2(2) == 1");
423}
424
425ATF_TC_BODY(log2_base, tc)
426{
427	ATF_CHECK(log2(2.0) == 1.0);
428}
429
430ATF_TC(log2_nan);
431ATF_TC_HEAD(log2_nan, tc)
432{
433	atf_tc_set_md_var(tc, "descr", "Test log2(NaN) == NaN");
434}
435
436ATF_TC_BODY(log2_nan, tc)
437{
438	const double x = 0.0L / 0.0L;
439
440	ATF_CHECK(isnan(x) != 0);
441	ATF_CHECK(isnan(log2(x)) != 0);
442}
443
444ATF_TC(log2_inf_neg);
445ATF_TC_HEAD(log2_inf_neg, tc)
446{
447	atf_tc_set_md_var(tc, "descr", "Test log2(-Inf) == NaN");
448}
449
450ATF_TC_BODY(log2_inf_neg, tc)
451{
452	const double x = -1.0L / 0.0L;
453	const double y = log2(x);
454
455	ATF_CHECK(isnan(y) != 0);
456}
457
458ATF_TC(log2_inf_pos);
459ATF_TC_HEAD(log2_inf_pos, tc)
460{
461	atf_tc_set_md_var(tc, "descr", "Test log2(+Inf) == +Inf");
462}
463
464ATF_TC_BODY(log2_inf_pos, tc)
465{
466	const double x = 1.0L / 0.0L;
467
468	ATF_CHECK(log2(x) == x);
469}
470
471ATF_TC(log2_one_pos);
472ATF_TC_HEAD(log2_one_pos, tc)
473{
474	atf_tc_set_md_var(tc, "descr", "Test log2(1.0) == +0.0");
475}
476
477ATF_TC_BODY(log2_one_pos, tc)
478{
479	const double x = log2(1.0);
480	const double y = 0.0L;
481
482	ATF_CHECK(x == y);
483	ATF_CHECK(signbit(x) == 0);
484	ATF_CHECK(signbit(y) == 0);
485}
486
487ATF_TC(log2_zero_neg);
488ATF_TC_HEAD(log2_zero_neg, tc)
489{
490	atf_tc_set_md_var(tc, "descr", "Test log2(-0.0) == -HUGE_VAL");
491}
492
493ATF_TC_BODY(log2_zero_neg, tc)
494{
495	const double x = -0.0L;
496
497	ATF_CHECK(log2(x) == -HUGE_VAL);
498}
499
500ATF_TC(log2_zero_pos);
501ATF_TC_HEAD(log2_zero_pos, tc)
502{
503	atf_tc_set_md_var(tc, "descr", "Test log2(+0.0) == -HUGE_VAL");
504}
505
506ATF_TC_BODY(log2_zero_pos, tc)
507{
508	const double x = 0.0L;
509
510	ATF_CHECK(log2(x) == -HUGE_VAL);
511}
512
513/*
514 * log2f(3)
515 */
516ATF_TC(log2f_base);
517ATF_TC_HEAD(log2f_base, tc)
518{
519	atf_tc_set_md_var(tc, "descr", "Test log2f(2) == 1");
520}
521
522ATF_TC_BODY(log2f_base, tc)
523{
524	ATF_CHECK(log2f(2.0) == 1.0);
525}
526
527ATF_TC(log2f_nan);
528ATF_TC_HEAD(log2f_nan, tc)
529{
530	atf_tc_set_md_var(tc, "descr", "Test log2f(NaN) == NaN");
531}
532
533ATF_TC_BODY(log2f_nan, tc)
534{
535	const float x = 0.0L / 0.0L;
536
537	ATF_CHECK(isnan(x) != 0);
538	ATF_CHECK(isnan(log2f(x)) != 0);
539}
540
541ATF_TC(log2f_inf_neg);
542ATF_TC_HEAD(log2f_inf_neg, tc)
543{
544	atf_tc_set_md_var(tc, "descr", "Test log2f(-Inf) == NaN");
545}
546
547ATF_TC_BODY(log2f_inf_neg, tc)
548{
549	const float x = -1.0L / 0.0L;
550	const float y = log2f(x);
551
552	ATF_CHECK(isnan(y) != 0);
553}
554
555ATF_TC(log2f_inf_pos);
556ATF_TC_HEAD(log2f_inf_pos, tc)
557{
558	atf_tc_set_md_var(tc, "descr", "Test log2f(+Inf) == +Inf");
559}
560
561ATF_TC_BODY(log2f_inf_pos, tc)
562{
563	const float x = 1.0L / 0.0L;
564
565#if defined(__alpha__)
566	atf_tc_expect_fail("PR port-alpha/46301");
567#endif
568
569	ATF_CHECK(log2f(x) == x);
570}
571
572ATF_TC(log2f_one_pos);
573ATF_TC_HEAD(log2f_one_pos, tc)
574{
575	atf_tc_set_md_var(tc, "descr", "Test log2f(1.0) == +0.0");
576}
577
578ATF_TC_BODY(log2f_one_pos, tc)
579{
580	const float x = log2f(1.0);
581	const float y = 0.0L;
582
583	ATF_CHECK(x == y);
584	ATF_CHECK(signbit(x) == 0);
585	ATF_CHECK(signbit(y) == 0);
586}
587
588ATF_TC(log2f_zero_neg);
589ATF_TC_HEAD(log2f_zero_neg, tc)
590{
591	atf_tc_set_md_var(tc, "descr", "Test log2f(-0.0) == -HUGE_VALF");
592}
593
594ATF_TC_BODY(log2f_zero_neg, tc)
595{
596	const float x = -0.0L;
597
598	ATF_CHECK(log2f(x) == -HUGE_VALF);
599}
600
601ATF_TC(log2f_zero_pos);
602ATF_TC_HEAD(log2f_zero_pos, tc)
603{
604	atf_tc_set_md_var(tc, "descr", "Test log2f(+0.0) == -HUGE_VALF");
605}
606
607ATF_TC_BODY(log2f_zero_pos, tc)
608{
609	const float x = 0.0L;
610
611	ATF_CHECK(log2f(x) == -HUGE_VALF);
612}
613
614/*
615 * log(3)
616 */
617ATF_TC(log_base);
618ATF_TC_HEAD(log_base, tc)
619{
620	atf_tc_set_md_var(tc, "descr", "Test log(e) == 1");
621}
622
623ATF_TC_BODY(log_base, tc)
624{
625	const double eps = 1.0e-38;
626
627	if (fabs(log(M_E) - 1.0) > eps)
628		atf_tc_fail_nonfatal("log(e) != 1");
629}
630
631ATF_TC(log_nan);
632ATF_TC_HEAD(log_nan, tc)
633{
634	atf_tc_set_md_var(tc, "descr", "Test log(NaN) == NaN");
635}
636
637ATF_TC_BODY(log_nan, tc)
638{
639	const double x = 0.0L / 0.0L;
640
641	ATF_CHECK(isnan(x) != 0);
642	ATF_CHECK(isnan(log(x)) != 0);
643}
644
645ATF_TC(log_inf_neg);
646ATF_TC_HEAD(log_inf_neg, tc)
647{
648	atf_tc_set_md_var(tc, "descr", "Test log(-Inf) == NaN");
649}
650
651ATF_TC_BODY(log_inf_neg, tc)
652{
653	const double x = -1.0L / 0.0L;
654	const double y = log(x);
655
656	ATF_CHECK(isnan(y) != 0);
657}
658
659ATF_TC(log_inf_pos);
660ATF_TC_HEAD(log_inf_pos, tc)
661{
662	atf_tc_set_md_var(tc, "descr", "Test log(+Inf) == +Inf");
663}
664
665ATF_TC_BODY(log_inf_pos, tc)
666{
667	const double x = 1.0L / 0.0L;
668
669	ATF_CHECK(log(x) == x);
670}
671
672ATF_TC(log_one_pos);
673ATF_TC_HEAD(log_one_pos, tc)
674{
675	atf_tc_set_md_var(tc, "descr", "Test log(1.0) == +0.0");
676}
677
678ATF_TC_BODY(log_one_pos, tc)
679{
680	const double x = log(1.0);
681	const double y = 0.0L;
682
683	ATF_CHECK(x == y);
684	ATF_CHECK(signbit(x) == 0);
685	ATF_CHECK(signbit(y) == 0);
686}
687
688ATF_TC(log_zero_neg);
689ATF_TC_HEAD(log_zero_neg, tc)
690{
691	atf_tc_set_md_var(tc, "descr", "Test log(-0.0) == -HUGE_VAL");
692}
693
694ATF_TC_BODY(log_zero_neg, tc)
695{
696	const double x = -0.0L;
697
698	ATF_CHECK(log(x) == -HUGE_VAL);
699}
700
701ATF_TC(log_zero_pos);
702ATF_TC_HEAD(log_zero_pos, tc)
703{
704	atf_tc_set_md_var(tc, "descr", "Test log(+0.0) == -HUGE_VAL");
705}
706
707ATF_TC_BODY(log_zero_pos, tc)
708{
709	const double x = 0.0L;
710
711	ATF_CHECK(log(x) == -HUGE_VAL);
712}
713
714/*
715 * logf(3)
716 */
717ATF_TC(logf_base);
718ATF_TC_HEAD(logf_base, tc)
719{
720	atf_tc_set_md_var(tc, "descr", "Test logf(e) == 1");
721}
722
723ATF_TC_BODY(logf_base, tc)
724{
725	const float eps = 1.0e-7;
726
727	if (fabsf(logf(M_E) - 1.0f) > eps)
728		atf_tc_fail_nonfatal("logf(e) != 1");
729}
730
731ATF_TC(logf_nan);
732ATF_TC_HEAD(logf_nan, tc)
733{
734	atf_tc_set_md_var(tc, "descr", "Test logf(NaN) == NaN");
735}
736
737ATF_TC_BODY(logf_nan, tc)
738{
739	const float x = 0.0L / 0.0L;
740
741	ATF_CHECK(isnan(x) != 0);
742	ATF_CHECK(isnan(logf(x)) != 0);
743}
744
745ATF_TC(logf_inf_neg);
746ATF_TC_HEAD(logf_inf_neg, tc)
747{
748	atf_tc_set_md_var(tc, "descr", "Test logf(-Inf) == NaN");
749}
750
751ATF_TC_BODY(logf_inf_neg, tc)
752{
753	const float x = -1.0L / 0.0L;
754	const float y = logf(x);
755
756	ATF_CHECK(isnan(y) != 0);
757}
758
759ATF_TC(logf_inf_pos);
760ATF_TC_HEAD(logf_inf_pos, tc)
761{
762	atf_tc_set_md_var(tc, "descr", "Test logf(+Inf) == +Inf");
763}
764
765ATF_TC_BODY(logf_inf_pos, tc)
766{
767	const float x = 1.0L / 0.0L;
768
769#if defined(__alpha__)
770	atf_tc_expect_fail("PR port-alpha/46301");
771#endif
772
773	ATF_CHECK(logf(x) == x);
774}
775
776ATF_TC(logf_one_pos);
777ATF_TC_HEAD(logf_one_pos, tc)
778{
779	atf_tc_set_md_var(tc, "descr", "Test logf(1.0) == +0.0");
780}
781
782ATF_TC_BODY(logf_one_pos, tc)
783{
784	const float x = logf(1.0);
785	const float y = 0.0L;
786
787	ATF_CHECK(x == y);
788	ATF_CHECK(signbit(x) == 0);
789	ATF_CHECK(signbit(y) == 0);
790}
791
792ATF_TC(logf_zero_neg);
793ATF_TC_HEAD(logf_zero_neg, tc)
794{
795	atf_tc_set_md_var(tc, "descr", "Test logf(-0.0) == -HUGE_VALF");
796}
797
798ATF_TC_BODY(logf_zero_neg, tc)
799{
800	const float x = -0.0L;
801
802	ATF_CHECK(logf(x) == -HUGE_VALF);
803}
804
805ATF_TC(logf_zero_pos);
806ATF_TC_HEAD(logf_zero_pos, tc)
807{
808	atf_tc_set_md_var(tc, "descr", "Test logf(+0.0) == -HUGE_VALF");
809}
810
811ATF_TC_BODY(logf_zero_pos, tc)
812{
813	const float x = 0.0L;
814
815	ATF_CHECK(logf(x) == -HUGE_VALF);
816}
817
818ATF_TP_ADD_TCS(tp)
819{
820
821	ATF_TP_ADD_TC(tp, log10_base);
822	ATF_TP_ADD_TC(tp, log10_nan);
823	ATF_TP_ADD_TC(tp, log10_inf_neg);
824	ATF_TP_ADD_TC(tp, log10_inf_pos);
825	ATF_TP_ADD_TC(tp, log10_one_pos);
826	ATF_TP_ADD_TC(tp, log10_zero_neg);
827	ATF_TP_ADD_TC(tp, log10_zero_pos);
828
829	ATF_TP_ADD_TC(tp, log10f_base);
830	ATF_TP_ADD_TC(tp, log10f_nan);
831	ATF_TP_ADD_TC(tp, log10f_inf_neg);
832	ATF_TP_ADD_TC(tp, log10f_inf_pos);
833	ATF_TP_ADD_TC(tp, log10f_one_pos);
834	ATF_TP_ADD_TC(tp, log10f_zero_neg);
835	ATF_TP_ADD_TC(tp, log10f_zero_pos);
836
837	ATF_TP_ADD_TC(tp, log1p_nan);
838	ATF_TP_ADD_TC(tp, log1p_inf_neg);
839	ATF_TP_ADD_TC(tp, log1p_inf_pos);
840	ATF_TP_ADD_TC(tp, log1p_one_neg);
841	ATF_TP_ADD_TC(tp, log1p_zero_neg);
842	ATF_TP_ADD_TC(tp, log1p_zero_pos);
843
844	ATF_TP_ADD_TC(tp, log1pf_nan);
845	ATF_TP_ADD_TC(tp, log1pf_inf_neg);
846	ATF_TP_ADD_TC(tp, log1pf_inf_pos);
847	ATF_TP_ADD_TC(tp, log1pf_one_neg);
848	ATF_TP_ADD_TC(tp, log1pf_zero_neg);
849	ATF_TP_ADD_TC(tp, log1pf_zero_pos);
850
851	ATF_TP_ADD_TC(tp, log2_base);
852	ATF_TP_ADD_TC(tp, log2_nan);
853	ATF_TP_ADD_TC(tp, log2_inf_neg);
854	ATF_TP_ADD_TC(tp, log2_inf_pos);
855	ATF_TP_ADD_TC(tp, log2_one_pos);
856	ATF_TP_ADD_TC(tp, log2_zero_neg);
857	ATF_TP_ADD_TC(tp, log2_zero_pos);
858
859	ATF_TP_ADD_TC(tp, log2f_base);
860	ATF_TP_ADD_TC(tp, log2f_nan);
861	ATF_TP_ADD_TC(tp, log2f_inf_neg);
862	ATF_TP_ADD_TC(tp, log2f_inf_pos);
863	ATF_TP_ADD_TC(tp, log2f_one_pos);
864	ATF_TP_ADD_TC(tp, log2f_zero_neg);
865	ATF_TP_ADD_TC(tp, log2f_zero_pos);
866
867	ATF_TP_ADD_TC(tp, log_base);
868	ATF_TP_ADD_TC(tp, log_nan);
869	ATF_TP_ADD_TC(tp, log_inf_neg);
870	ATF_TP_ADD_TC(tp, log_inf_pos);
871	ATF_TP_ADD_TC(tp, log_one_pos);
872	ATF_TP_ADD_TC(tp, log_zero_neg);
873	ATF_TP_ADD_TC(tp, log_zero_pos);
874
875	ATF_TP_ADD_TC(tp, logf_base);
876	ATF_TP_ADD_TC(tp, logf_nan);
877	ATF_TP_ADD_TC(tp, logf_inf_neg);
878	ATF_TP_ADD_TC(tp, logf_inf_pos);
879	ATF_TP_ADD_TC(tp, logf_one_pos);
880	ATF_TP_ADD_TC(tp, logf_zero_neg);
881	ATF_TP_ADD_TC(tp, logf_zero_pos);
882
883	return atf_no_error();
884}
885