Home | History | Annotate | Line # | Download | only in libm
t_log.c revision 1.6
      1 /* $NetBSD: t_log.c,v 1.6 2012/02/05 17:52:55 matt 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.6 2012/02/05 17:52:55 matt 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-38;
    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