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