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