xref: /netbsd-src/tests/lib/libm/t_log.c (revision 9273f704b781e402a14f2671db2bb2c85fb032dd)
1 /* $NetBSD: t_log.c,v 1.5 2011/09/18 04:49:11 jruoho 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.5 2011/09/18 04:49:11 jruoho Exp $");
33 
34 #include <atf-c.h>
35 #include <stdio.h>
36 #include <math.h>
37 
38 /*
39  * log10(3)
40  */
41 ATF_TC(log10_base);
42 ATF_TC_HEAD(log10_base, tc)
43 {
44 	atf_tc_set_md_var(tc, "descr", "Test log10(10) == 1");
45 }
46 
47 ATF_TC_BODY(log10_base, tc)
48 {
49 	ATF_CHECK(log10(10.0) == 1.0);
50 }
51 
52 ATF_TC(log10_nan);
53 ATF_TC_HEAD(log10_nan, tc)
54 {
55 	atf_tc_set_md_var(tc, "descr", "Test log10(NaN) == NaN");
56 }
57 
58 ATF_TC_BODY(log10_nan, tc)
59 {
60 #ifndef __vax__
61 	const double x = 0.0L / 0.0L;
62 
63 	ATF_CHECK(isnan(x) != 0);
64 	ATF_CHECK(isnan(log10(x)) != 0);
65 #endif
66 }
67 
68 ATF_TC(log10_inf_neg);
69 ATF_TC_HEAD(log10_inf_neg, tc)
70 {
71 	atf_tc_set_md_var(tc, "descr", "Test log10(-Inf) == NaN");
72 }
73 
74 ATF_TC_BODY(log10_inf_neg, tc)
75 {
76 #ifndef __vax__
77 	const double x = -1.0L / 0.0L;
78 	const double y = log10(x);
79 
80 	ATF_CHECK(isnan(y) != 0);
81 #endif
82 }
83 
84 ATF_TC(log10_inf_pos);
85 ATF_TC_HEAD(log10_inf_pos, tc)
86 {
87 	atf_tc_set_md_var(tc, "descr", "Test log10(+Inf) == +Inf");
88 }
89 
90 ATF_TC_BODY(log10_inf_pos, tc)
91 {
92 #ifndef __vax__
93 	const double x = 1.0L / 0.0L;
94 
95 	ATF_CHECK(log10(x) == x);
96 #endif
97 }
98 
99 ATF_TC(log10_one_pos);
100 ATF_TC_HEAD(log10_one_pos, tc)
101 {
102 	atf_tc_set_md_var(tc, "descr", "Test log10(1.0) == +0.0");
103 }
104 
105 ATF_TC_BODY(log10_one_pos, tc)
106 {
107 #ifndef __vax__
108 	const double x = log10(1.0);
109 	const double y = 0.0L;
110 
111 	ATF_CHECK(x == y);
112 	ATF_CHECK(signbit(x) == 0);
113 	ATF_CHECK(signbit(y) == 0);
114 #endif
115 }
116 
117 ATF_TC(log10_zero_neg);
118 ATF_TC_HEAD(log10_zero_neg, tc)
119 {
120 	atf_tc_set_md_var(tc, "descr", "Test log10(-0.0) == -HUGE_VAL");
121 }
122 
123 ATF_TC_BODY(log10_zero_neg, tc)
124 {
125 #ifndef __vax__
126 	const double x = -0.0L;
127 
128 	ATF_CHECK(log10(x) == -HUGE_VAL);
129 #endif
130 }
131 
132 ATF_TC(log10_zero_pos);
133 ATF_TC_HEAD(log10_zero_pos, tc)
134 {
135 	atf_tc_set_md_var(tc, "descr", "Test log10(+0.0) == -HUGE_VAL");
136 }
137 
138 ATF_TC_BODY(log10_zero_pos, tc)
139 {
140 #ifndef __vax__
141 	const double x = 0.0L;
142 
143 	ATF_CHECK(log10(x) == -HUGE_VAL);
144 #endif
145 }
146 
147 /*
148  * log10f(3)
149  */
150 ATF_TC(log10f_base);
151 ATF_TC_HEAD(log10f_base, tc)
152 {
153 	atf_tc_set_md_var(tc, "descr", "Test log10f(10) == 1");
154 }
155 
156 ATF_TC_BODY(log10f_base, tc)
157 {
158 	ATF_CHECK(log10f(10.0) == 1.0);
159 }
160 
161 ATF_TC(log10f_nan);
162 ATF_TC_HEAD(log10f_nan, tc)
163 {
164 	atf_tc_set_md_var(tc, "descr", "Test log10f(NaN) == NaN");
165 }
166 
167 ATF_TC_BODY(log10f_nan, tc)
168 {
169 #ifndef __vax__
170 	const float x = 0.0L / 0.0L;
171 
172 	ATF_CHECK(isnan(x) != 0);
173 	ATF_CHECK(isnan(log10f(x)) != 0);
174 #endif
175 }
176 
177 ATF_TC(log10f_inf_neg);
178 ATF_TC_HEAD(log10f_inf_neg, tc)
179 {
180 	atf_tc_set_md_var(tc, "descr", "Test log10f(-Inf) == NaN");
181 }
182 
183 ATF_TC_BODY(log10f_inf_neg, tc)
184 {
185 #ifndef __vax__
186 	const float x = -1.0L / 0.0L;
187 	const float y = log10f(x);
188 
189 	ATF_CHECK(isnan(y) != 0);
190 #endif
191 }
192 
193 ATF_TC(log10f_inf_pos);
194 ATF_TC_HEAD(log10f_inf_pos, tc)
195 {
196 	atf_tc_set_md_var(tc, "descr", "Test log10f(+Inf) == +Inf");
197 }
198 
199 ATF_TC_BODY(log10f_inf_pos, tc)
200 {
201 #ifndef __vax__
202 	const float x = 1.0L / 0.0L;
203 
204 	ATF_CHECK(log10f(x) == x);
205 #endif
206 }
207 
208 ATF_TC(log10f_one_pos);
209 ATF_TC_HEAD(log10f_one_pos, tc)
210 {
211 	atf_tc_set_md_var(tc, "descr", "Test log10f(1.0) == +0.0");
212 }
213 
214 ATF_TC_BODY(log10f_one_pos, tc)
215 {
216 #ifndef __vax__
217 	const float x = log10f(1.0);
218 	const float y = 0.0L;
219 
220 	ATF_CHECK(x == y);
221 	ATF_CHECK(signbit(x) == 0);
222 	ATF_CHECK(signbit(y) == 0);
223 #endif
224 }
225 
226 ATF_TC(log10f_zero_neg);
227 ATF_TC_HEAD(log10f_zero_neg, tc)
228 {
229 	atf_tc_set_md_var(tc, "descr", "Test log10f(-0.0) == -HUGE_VALF");
230 }
231 
232 ATF_TC_BODY(log10f_zero_neg, tc)
233 {
234 #ifndef __vax__
235 	const float x = -0.0L;
236 
237 	ATF_CHECK(log10f(x) == -HUGE_VALF);
238 #endif
239 }
240 
241 ATF_TC(log10f_zero_pos);
242 ATF_TC_HEAD(log10f_zero_pos, tc)
243 {
244 	atf_tc_set_md_var(tc, "descr", "Test log10f(+0.0) == -HUGE_VALF");
245 }
246 
247 ATF_TC_BODY(log10f_zero_pos, tc)
248 {
249 #ifndef __vax__
250 	const float x = 0.0L;
251 
252 	ATF_CHECK(log10f(x) == -HUGE_VALF);
253 #endif
254 }
255 
256 /*
257  * log1p(3)
258  */
259 ATF_TC(log1p_nan);
260 ATF_TC_HEAD(log1p_nan, tc)
261 {
262 	atf_tc_set_md_var(tc, "descr", "Test log1p(NaN) == NaN");
263 }
264 
265 ATF_TC_BODY(log1p_nan, tc)
266 {
267 #ifndef __vax__
268 	const double x = 0.0L / 0.0L;
269 
270 	ATF_CHECK(isnan(x) != 0);
271 	ATF_CHECK(isnan(log1p(x)) != 0);
272 #endif
273 }
274 
275 ATF_TC(log1p_inf_neg);
276 ATF_TC_HEAD(log1p_inf_neg, tc)
277 {
278 	atf_tc_set_md_var(tc, "descr", "Test log1p(-Inf) == NaN");
279 }
280 
281 ATF_TC_BODY(log1p_inf_neg, tc)
282 {
283 #ifndef __vax__
284 	const double x = -1.0L / 0.0L;
285 	const double y = log1p(x);
286 
287 	if (isnan(y) == 0) {
288 		atf_tc_expect_fail("PR lib/45362");
289 		atf_tc_fail("log1p(-Inf) != NaN");
290 	}
291 #endif
292 }
293 
294 ATF_TC(log1p_inf_pos);
295 ATF_TC_HEAD(log1p_inf_pos, tc)
296 {
297 	atf_tc_set_md_var(tc, "descr", "Test log1p(+Inf) == +Inf");
298 }
299 
300 ATF_TC_BODY(log1p_inf_pos, tc)
301 {
302 #ifndef __vax__
303 	const double x = 1.0L / 0.0L;
304 
305 	ATF_CHECK(log1p(x) == x);
306 #endif
307 }
308 
309 ATF_TC(log1p_one_neg);
310 ATF_TC_HEAD(log1p_one_neg, tc)
311 {
312 	atf_tc_set_md_var(tc, "descr", "Test log1p(-1.0) == -HUGE_VAL");
313 }
314 
315 ATF_TC_BODY(log1p_one_neg, tc)
316 {
317 #ifndef __vax__
318 	const double x = log1p(-1.0);
319 
320 	if (x != -HUGE_VAL) {
321 		atf_tc_expect_fail("PR lib/45362");
322 		atf_tc_fail("log1p(-1.0) != -HUGE_VAL");
323 	}
324 #endif
325 }
326 
327 ATF_TC(log1p_zero_neg);
328 ATF_TC_HEAD(log1p_zero_neg, tc)
329 {
330 	atf_tc_set_md_var(tc, "descr", "Test log1p(-0.0) == -0.0");
331 }
332 
333 ATF_TC_BODY(log1p_zero_neg, tc)
334 {
335 #ifndef __vax__
336 	const double x = -0.0L;
337 
338 	ATF_CHECK(log1p(x) == x);
339 #endif
340 }
341 
342 ATF_TC(log1p_zero_pos);
343 ATF_TC_HEAD(log1p_zero_pos, tc)
344 {
345 	atf_tc_set_md_var(tc, "descr", "Test log1p(+0.0) == +0.0");
346 }
347 
348 ATF_TC_BODY(log1p_zero_pos, tc)
349 {
350 #ifndef __vax__
351 	const double x = 0.0L;
352 
353 	ATF_CHECK(log1p(x) == x);
354 #endif
355 }
356 
357 /*
358  * log1pf(3)
359  */
360 ATF_TC(log1pf_nan);
361 ATF_TC_HEAD(log1pf_nan, tc)
362 {
363 	atf_tc_set_md_var(tc, "descr", "Test log1pf(NaN) == NaN");
364 }
365 
366 ATF_TC_BODY(log1pf_nan, tc)
367 {
368 #ifndef __vax__
369 	const float x = 0.0L / 0.0L;
370 
371 	ATF_CHECK(isnan(x) != 0);
372 	ATF_CHECK(isnan(log1pf(x)) != 0);
373 #endif
374 }
375 
376 ATF_TC(log1pf_inf_neg);
377 ATF_TC_HEAD(log1pf_inf_neg, tc)
378 {
379 	atf_tc_set_md_var(tc, "descr", "Test log1pf(-Inf) == NaN");
380 }
381 
382 ATF_TC_BODY(log1pf_inf_neg, tc)
383 {
384 #ifndef __vax__
385 	const float x = -1.0L / 0.0L;
386 	const float y = log1pf(x);
387 
388 	if (isnan(y) == 0) {
389 		atf_tc_expect_fail("PR lib/45362");
390 		atf_tc_fail("log1pf(-Inf) != NaN");
391 	}
392 #endif
393 }
394 
395 ATF_TC(log1pf_inf_pos);
396 ATF_TC_HEAD(log1pf_inf_pos, tc)
397 {
398 	atf_tc_set_md_var(tc, "descr", "Test log1pf(+Inf) == +Inf");
399 }
400 
401 ATF_TC_BODY(log1pf_inf_pos, tc)
402 {
403 #ifndef __vax__
404 	const float x = 1.0L / 0.0L;
405 
406 	ATF_CHECK(log1pf(x) == x);
407 #endif
408 }
409 
410 ATF_TC(log1pf_one_neg);
411 ATF_TC_HEAD(log1pf_one_neg, tc)
412 {
413 	atf_tc_set_md_var(tc, "descr", "Test log1pf(-1.0) == -HUGE_VALF");
414 }
415 
416 ATF_TC_BODY(log1pf_one_neg, tc)
417 {
418 #ifndef __vax__
419 	const float x = log1pf(-1.0);
420 
421 	if (x != -HUGE_VALF) {
422 		atf_tc_expect_fail("PR lib/45362");
423 		atf_tc_fail("log1pf(-1.0) != -HUGE_VALF");
424 	}
425 #endif
426 }
427 
428 ATF_TC(log1pf_zero_neg);
429 ATF_TC_HEAD(log1pf_zero_neg, tc)
430 {
431 	atf_tc_set_md_var(tc, "descr", "Test log1pf(-0.0) == -0.0");
432 }
433 
434 ATF_TC_BODY(log1pf_zero_neg, tc)
435 {
436 #ifndef __vax__
437 	const float x = -0.0L;
438 
439 	ATF_CHECK(log1pf(x) == x);
440 #endif
441 }
442 
443 ATF_TC(log1pf_zero_pos);
444 ATF_TC_HEAD(log1pf_zero_pos, tc)
445 {
446 	atf_tc_set_md_var(tc, "descr", "Test log1pf(+0.0) == +0.0");
447 }
448 
449 ATF_TC_BODY(log1pf_zero_pos, tc)
450 {
451 #ifndef __vax__
452 	const float x = 0.0L;
453 
454 	ATF_CHECK(log1pf(x) == x);
455 #endif
456 }
457 
458 /*
459  * log2(3)
460  */
461 ATF_TC(log2_base);
462 ATF_TC_HEAD(log2_base, tc)
463 {
464 	atf_tc_set_md_var(tc, "descr", "Test log2(2) == 1");
465 }
466 
467 ATF_TC_BODY(log2_base, tc)
468 {
469 	ATF_CHECK(log2(2.0) == 1.0);
470 }
471 
472 ATF_TC(log2_nan);
473 ATF_TC_HEAD(log2_nan, tc)
474 {
475 	atf_tc_set_md_var(tc, "descr", "Test log2(NaN) == NaN");
476 }
477 
478 ATF_TC_BODY(log2_nan, tc)
479 {
480 #ifndef __vax__
481 	const double x = 0.0L / 0.0L;
482 
483 	ATF_CHECK(isnan(x) != 0);
484 	ATF_CHECK(isnan(log2(x)) != 0);
485 #endif
486 }
487 
488 ATF_TC(log2_inf_neg);
489 ATF_TC_HEAD(log2_inf_neg, tc)
490 {
491 	atf_tc_set_md_var(tc, "descr", "Test log2(-Inf) == NaN");
492 }
493 
494 ATF_TC_BODY(log2_inf_neg, tc)
495 {
496 #ifndef __vax__
497 	const double x = -1.0L / 0.0L;
498 	const double y = log2(x);
499 
500 	ATF_CHECK(isnan(y) != 0);
501 #endif
502 }
503 
504 ATF_TC(log2_inf_pos);
505 ATF_TC_HEAD(log2_inf_pos, tc)
506 {
507 	atf_tc_set_md_var(tc, "descr", "Test log2(+Inf) == +Inf");
508 }
509 
510 ATF_TC_BODY(log2_inf_pos, tc)
511 {
512 #ifndef __vax__
513 	const double x = 1.0L / 0.0L;
514 
515 	ATF_CHECK(log2(x) == x);
516 #endif
517 }
518 
519 ATF_TC(log2_one_pos);
520 ATF_TC_HEAD(log2_one_pos, tc)
521 {
522 	atf_tc_set_md_var(tc, "descr", "Test log2(1.0) == +0.0");
523 }
524 
525 ATF_TC_BODY(log2_one_pos, tc)
526 {
527 #ifndef __vax__
528 	const double x = log2(1.0);
529 	const double y = 0.0L;
530 
531 	ATF_CHECK(x == y);
532 	ATF_CHECK(signbit(x) == 0);
533 	ATF_CHECK(signbit(y) == 0);
534 #endif
535 }
536 
537 ATF_TC(log2_zero_neg);
538 ATF_TC_HEAD(log2_zero_neg, tc)
539 {
540 	atf_tc_set_md_var(tc, "descr", "Test log2(-0.0) == -HUGE_VAL");
541 }
542 
543 ATF_TC_BODY(log2_zero_neg, tc)
544 {
545 #ifndef __vax__
546 	const double x = -0.0L;
547 
548 	ATF_CHECK(log2(x) == -HUGE_VAL);
549 #endif
550 }
551 
552 ATF_TC(log2_zero_pos);
553 ATF_TC_HEAD(log2_zero_pos, tc)
554 {
555 	atf_tc_set_md_var(tc, "descr", "Test log2(+0.0) == -HUGE_VAL");
556 }
557 
558 ATF_TC_BODY(log2_zero_pos, tc)
559 {
560 #ifndef __vax__
561 	const double x = 0.0L;
562 
563 	ATF_CHECK(log2(x) == -HUGE_VAL);
564 #endif
565 }
566 
567 /*
568  * log2f(3)
569  */
570 ATF_TC(log2f_base);
571 ATF_TC_HEAD(log2f_base, tc)
572 {
573 	atf_tc_set_md_var(tc, "descr", "Test log2f(2) == 1");
574 }
575 
576 ATF_TC_BODY(log2f_base, tc)
577 {
578 	ATF_CHECK(log2f(2.0) == 1.0);
579 }
580 
581 ATF_TC(log2f_nan);
582 ATF_TC_HEAD(log2f_nan, tc)
583 {
584 	atf_tc_set_md_var(tc, "descr", "Test log2f(NaN) == NaN");
585 }
586 
587 ATF_TC_BODY(log2f_nan, tc)
588 {
589 #ifndef __vax__
590 	const float x = 0.0L / 0.0L;
591 
592 	ATF_CHECK(isnan(x) != 0);
593 	ATF_CHECK(isnan(log2f(x)) != 0);
594 #endif
595 }
596 
597 ATF_TC(log2f_inf_neg);
598 ATF_TC_HEAD(log2f_inf_neg, tc)
599 {
600 	atf_tc_set_md_var(tc, "descr", "Test log2f(-Inf) == NaN");
601 }
602 
603 ATF_TC_BODY(log2f_inf_neg, tc)
604 {
605 #ifndef __vax__
606 	const float x = -1.0L / 0.0L;
607 	const float y = log2f(x);
608 
609 	ATF_CHECK(isnan(y) != 0);
610 #endif
611 }
612 
613 ATF_TC(log2f_inf_pos);
614 ATF_TC_HEAD(log2f_inf_pos, tc)
615 {
616 	atf_tc_set_md_var(tc, "descr", "Test log2f(+Inf) == +Inf");
617 }
618 
619 ATF_TC_BODY(log2f_inf_pos, tc)
620 {
621 #ifndef __vax__
622 	const float x = 1.0L / 0.0L;
623 
624 	ATF_CHECK(log2f(x) == x);
625 #endif
626 }
627 
628 ATF_TC(log2f_one_pos);
629 ATF_TC_HEAD(log2f_one_pos, tc)
630 {
631 	atf_tc_set_md_var(tc, "descr", "Test log2f(1.0) == +0.0");
632 }
633 
634 ATF_TC_BODY(log2f_one_pos, tc)
635 {
636 #ifndef __vax__
637 	const float x = log2f(1.0);
638 	const float y = 0.0L;
639 
640 	ATF_CHECK(x == y);
641 	ATF_CHECK(signbit(x) == 0);
642 	ATF_CHECK(signbit(y) == 0);
643 #endif
644 }
645 
646 ATF_TC(log2f_zero_neg);
647 ATF_TC_HEAD(log2f_zero_neg, tc)
648 {
649 	atf_tc_set_md_var(tc, "descr", "Test log2f(-0.0) == -HUGE_VALF");
650 }
651 
652 ATF_TC_BODY(log2f_zero_neg, tc)
653 {
654 #ifndef __vax__
655 	const float x = -0.0L;
656 
657 	ATF_CHECK(log2f(x) == -HUGE_VALF);
658 #endif
659 }
660 
661 ATF_TC(log2f_zero_pos);
662 ATF_TC_HEAD(log2f_zero_pos, tc)
663 {
664 	atf_tc_set_md_var(tc, "descr", "Test log2f(+0.0) == -HUGE_VALF");
665 }
666 
667 ATF_TC_BODY(log2f_zero_pos, tc)
668 {
669 #ifndef __vax__
670 	const float x = 0.0L;
671 
672 	ATF_CHECK(log2f(x) == -HUGE_VALF);
673 #endif
674 }
675 
676 /*
677  * log(3)
678  */
679 ATF_TC(log_base);
680 ATF_TC_HEAD(log_base, tc)
681 {
682 	atf_tc_set_md_var(tc, "descr", "Test log(e) == 1");
683 }
684 
685 ATF_TC_BODY(log_base, tc)
686 {
687 	const double eps = 1.0e-40;
688 
689 	if (fabs(log(M_E) - 1.0) > eps)
690 		atf_tc_fail_nonfatal("log(e) != 1");
691 }
692 
693 ATF_TC(log_nan);
694 ATF_TC_HEAD(log_nan, tc)
695 {
696 	atf_tc_set_md_var(tc, "descr", "Test log(NaN) == NaN");
697 }
698 
699 ATF_TC_BODY(log_nan, tc)
700 {
701 #ifndef __vax__
702 	const double x = 0.0L / 0.0L;
703 
704 	ATF_CHECK(isnan(x) != 0);
705 	ATF_CHECK(isnan(log(x)) != 0);
706 #endif
707 }
708 
709 ATF_TC(log_inf_neg);
710 ATF_TC_HEAD(log_inf_neg, tc)
711 {
712 	atf_tc_set_md_var(tc, "descr", "Test log(-Inf) == NaN");
713 }
714 
715 ATF_TC_BODY(log_inf_neg, tc)
716 {
717 #ifndef __vax__
718 	const double x = -1.0L / 0.0L;
719 	const double y = log(x);
720 
721 	ATF_CHECK(isnan(y) != 0);
722 #endif
723 }
724 
725 ATF_TC(log_inf_pos);
726 ATF_TC_HEAD(log_inf_pos, tc)
727 {
728 	atf_tc_set_md_var(tc, "descr", "Test log(+Inf) == +Inf");
729 }
730 
731 ATF_TC_BODY(log_inf_pos, tc)
732 {
733 #ifndef __vax__
734 	const double x = 1.0L / 0.0L;
735 
736 	ATF_CHECK(log(x) == x);
737 #endif
738 }
739 
740 ATF_TC(log_one_pos);
741 ATF_TC_HEAD(log_one_pos, tc)
742 {
743 	atf_tc_set_md_var(tc, "descr", "Test log(1.0) == +0.0");
744 }
745 
746 ATF_TC_BODY(log_one_pos, tc)
747 {
748 #ifndef __vax__
749 	const double x = log(1.0);
750 	const double y = 0.0L;
751 
752 	ATF_CHECK(x == y);
753 	ATF_CHECK(signbit(x) == 0);
754 	ATF_CHECK(signbit(y) == 0);
755 #endif
756 }
757 
758 ATF_TC(log_zero_neg);
759 ATF_TC_HEAD(log_zero_neg, tc)
760 {
761 	atf_tc_set_md_var(tc, "descr", "Test log(-0.0) == -HUGE_VAL");
762 }
763 
764 ATF_TC_BODY(log_zero_neg, tc)
765 {
766 #ifndef __vax__
767 	const double x = -0.0L;
768 
769 	ATF_CHECK(log(x) == -HUGE_VAL);
770 #endif
771 }
772 
773 ATF_TC(log_zero_pos);
774 ATF_TC_HEAD(log_zero_pos, tc)
775 {
776 	atf_tc_set_md_var(tc, "descr", "Test log(+0.0) == -HUGE_VAL");
777 }
778 
779 ATF_TC_BODY(log_zero_pos, tc)
780 {
781 #ifndef __vax__
782 	const double x = 0.0L;
783 
784 	ATF_CHECK(log(x) == -HUGE_VAL);
785 #endif
786 }
787 
788 /*
789  * logf(3)
790  */
791 ATF_TC(logf_base);
792 ATF_TC_HEAD(logf_base, tc)
793 {
794 	atf_tc_set_md_var(tc, "descr", "Test logf(e) == 1");
795 }
796 
797 ATF_TC_BODY(logf_base, tc)
798 {
799 	const float eps = 1.0e-7;
800 
801 	if (fabsf(logf(M_E) - 1.0) > eps)
802 		atf_tc_fail_nonfatal("logf(e) != 1");
803 }
804 
805 ATF_TC(logf_nan);
806 ATF_TC_HEAD(logf_nan, tc)
807 {
808 	atf_tc_set_md_var(tc, "descr", "Test logf(NaN) == NaN");
809 }
810 
811 ATF_TC_BODY(logf_nan, tc)
812 {
813 #ifndef __vax__
814 	const float x = 0.0L / 0.0L;
815 
816 	ATF_CHECK(isnan(x) != 0);
817 	ATF_CHECK(isnan(logf(x)) != 0);
818 #endif
819 }
820 
821 ATF_TC(logf_inf_neg);
822 ATF_TC_HEAD(logf_inf_neg, tc)
823 {
824 	atf_tc_set_md_var(tc, "descr", "Test logf(-Inf) == NaN");
825 }
826 
827 ATF_TC_BODY(logf_inf_neg, tc)
828 {
829 #ifndef __vax__
830 	const float x = -1.0L / 0.0L;
831 	const float y = logf(x);
832 
833 	ATF_CHECK(isnan(y) != 0);
834 #endif
835 }
836 
837 ATF_TC(logf_inf_pos);
838 ATF_TC_HEAD(logf_inf_pos, tc)
839 {
840 	atf_tc_set_md_var(tc, "descr", "Test logf(+Inf) == +Inf");
841 }
842 
843 ATF_TC_BODY(logf_inf_pos, tc)
844 {
845 #ifndef __vax__
846 	const float x = 1.0L / 0.0L;
847 
848 	ATF_CHECK(logf(x) == x);
849 #endif
850 }
851 
852 ATF_TC(logf_one_pos);
853 ATF_TC_HEAD(logf_one_pos, tc)
854 {
855 	atf_tc_set_md_var(tc, "descr", "Test logf(1.0) == +0.0");
856 }
857 
858 ATF_TC_BODY(logf_one_pos, tc)
859 {
860 #ifndef __vax__
861 	const float x = logf(1.0);
862 	const float y = 0.0L;
863 
864 	ATF_CHECK(x == y);
865 	ATF_CHECK(signbit(x) == 0);
866 	ATF_CHECK(signbit(y) == 0);
867 #endif
868 }
869 
870 ATF_TC(logf_zero_neg);
871 ATF_TC_HEAD(logf_zero_neg, tc)
872 {
873 	atf_tc_set_md_var(tc, "descr", "Test logf(-0.0) == -HUGE_VALF");
874 }
875 
876 ATF_TC_BODY(logf_zero_neg, tc)
877 {
878 #ifndef __vax__
879 	const float x = -0.0L;
880 
881 	ATF_CHECK(logf(x) == -HUGE_VALF);
882 #endif
883 }
884 
885 ATF_TC(logf_zero_pos);
886 ATF_TC_HEAD(logf_zero_pos, tc)
887 {
888 	atf_tc_set_md_var(tc, "descr", "Test logf(+0.0) == -HUGE_VALF");
889 }
890 
891 ATF_TC_BODY(logf_zero_pos, tc)
892 {
893 #ifndef __vax__
894 	const float x = 0.0L;
895 
896 	ATF_CHECK(logf(x) == -HUGE_VALF);
897 #endif
898 }
899 
900 ATF_TP_ADD_TCS(tp)
901 {
902 
903 	ATF_TP_ADD_TC(tp, log10_base);
904 	ATF_TP_ADD_TC(tp, log10_nan);
905 	ATF_TP_ADD_TC(tp, log10_inf_neg);
906 	ATF_TP_ADD_TC(tp, log10_inf_pos);
907 	ATF_TP_ADD_TC(tp, log10_one_pos);
908 	ATF_TP_ADD_TC(tp, log10_zero_neg);
909 	ATF_TP_ADD_TC(tp, log10_zero_pos);
910 
911 	ATF_TP_ADD_TC(tp, log10f_base);
912 	ATF_TP_ADD_TC(tp, log10f_nan);
913 	ATF_TP_ADD_TC(tp, log10f_inf_neg);
914 	ATF_TP_ADD_TC(tp, log10f_inf_pos);
915 	ATF_TP_ADD_TC(tp, log10f_one_pos);
916 	ATF_TP_ADD_TC(tp, log10f_zero_neg);
917 	ATF_TP_ADD_TC(tp, log10f_zero_pos);
918 
919 	ATF_TP_ADD_TC(tp, log1p_nan);
920 	ATF_TP_ADD_TC(tp, log1p_inf_neg);
921 	ATF_TP_ADD_TC(tp, log1p_inf_pos);
922 	ATF_TP_ADD_TC(tp, log1p_one_neg);
923 	ATF_TP_ADD_TC(tp, log1p_zero_neg);
924 	ATF_TP_ADD_TC(tp, log1p_zero_pos);
925 
926 	ATF_TP_ADD_TC(tp, log1pf_nan);
927 	ATF_TP_ADD_TC(tp, log1pf_inf_neg);
928 	ATF_TP_ADD_TC(tp, log1pf_inf_pos);
929 	ATF_TP_ADD_TC(tp, log1pf_one_neg);
930 	ATF_TP_ADD_TC(tp, log1pf_zero_neg);
931 	ATF_TP_ADD_TC(tp, log1pf_zero_pos);
932 
933 	ATF_TP_ADD_TC(tp, log2_base);
934 	ATF_TP_ADD_TC(tp, log2_nan);
935 	ATF_TP_ADD_TC(tp, log2_inf_neg);
936 	ATF_TP_ADD_TC(tp, log2_inf_pos);
937 	ATF_TP_ADD_TC(tp, log2_one_pos);
938 	ATF_TP_ADD_TC(tp, log2_zero_neg);
939 	ATF_TP_ADD_TC(tp, log2_zero_pos);
940 
941 	ATF_TP_ADD_TC(tp, log2f_base);
942 	ATF_TP_ADD_TC(tp, log2f_nan);
943 	ATF_TP_ADD_TC(tp, log2f_inf_neg);
944 	ATF_TP_ADD_TC(tp, log2f_inf_pos);
945 	ATF_TP_ADD_TC(tp, log2f_one_pos);
946 	ATF_TP_ADD_TC(tp, log2f_zero_neg);
947 	ATF_TP_ADD_TC(tp, log2f_zero_pos);
948 
949 	ATF_TP_ADD_TC(tp, log_base);
950 	ATF_TP_ADD_TC(tp, log_nan);
951 	ATF_TP_ADD_TC(tp, log_inf_neg);
952 	ATF_TP_ADD_TC(tp, log_inf_pos);
953 	ATF_TP_ADD_TC(tp, log_one_pos);
954 	ATF_TP_ADD_TC(tp, log_zero_neg);
955 	ATF_TP_ADD_TC(tp, log_zero_pos);
956 
957 	ATF_TP_ADD_TC(tp, logf_base);
958 	ATF_TP_ADD_TC(tp, logf_nan);
959 	ATF_TP_ADD_TC(tp, logf_inf_neg);
960 	ATF_TP_ADD_TC(tp, logf_inf_pos);
961 	ATF_TP_ADD_TC(tp, logf_one_pos);
962 	ATF_TP_ADD_TC(tp, logf_zero_neg);
963 	ATF_TP_ADD_TC(tp, logf_zero_pos);
964 
965 	return atf_no_error();
966 }
967