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