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