Sat Sep 17 08:15:43 2011 UTC ()
IEEE corner case tests for the pow(3) family (incl. PR lib/45372).
(jruoho)
diff -r1.385 -r1.386 src/distrib/sets/lists/tests/mi
diff -r1.9 -r1.10 src/tests/lib/libm/Makefile
diff -r0 -r1.1 src/tests/lib/libm/t_pow.c
--- src/distrib/sets/lists/tests/mi 2011/09/14 05:18:18 1.385
+++ src/distrib/sets/lists/tests/mi 2011/09/17 08:15:43 1.386
| @@ -1,14 +1,14 @@ | | | @@ -1,14 +1,14 @@ |
1 | # $NetBSD: mi,v 1.385 2011/09/14 05:18:18 jruoho Exp $ | | 1 | # $NetBSD: mi,v 1.386 2011/09/17 08:15:43 jruoho Exp $ |
2 | # | | 2 | # |
3 | # Note: don't delete entries from here - mark them as "obsolete" instead. | | 3 | # Note: don't delete entries from here - mark them as "obsolete" instead. |
4 | # | | 4 | # |
5 | ./etc/mtree/set.tests tests-sys-root | | 5 | ./etc/mtree/set.tests tests-sys-root |
6 | ./usr/libdata/debug/usr/tests tests-base-debug | | 6 | ./usr/libdata/debug/usr/tests tests-base-debug |
7 | ./usr/libdata/debug/usr/tests/atf tests-atf-debug | | 7 | ./usr/libdata/debug/usr/tests/atf tests-atf-debug |
8 | ./usr/libdata/debug/usr/tests/atf/atf-c tests-atf-debug | | 8 | ./usr/libdata/debug/usr/tests/atf/atf-c tests-atf-debug |
9 | ./usr/libdata/debug/usr/tests/atf/atf-c/atf_c_test.debug tests-atf-debug debug,atf | | 9 | ./usr/libdata/debug/usr/tests/atf/atf-c/atf_c_test.debug tests-atf-debug debug,atf |
10 | ./usr/libdata/debug/usr/tests/atf/atf-c/build_test.debug tests-atf-debug debug,atf | | 10 | ./usr/libdata/debug/usr/tests/atf/atf-c/build_test.debug tests-atf-debug debug,atf |
11 | ./usr/libdata/debug/usr/tests/atf/atf-c/check_test.debug tests-atf-debug debug,atf | | 11 | ./usr/libdata/debug/usr/tests/atf/atf-c/check_test.debug tests-atf-debug debug,atf |
12 | ./usr/libdata/debug/usr/tests/atf/atf-c/config_test.debug tests-atf-debug debug,atf | | 12 | ./usr/libdata/debug/usr/tests/atf/atf-c/config_test.debug tests-atf-debug debug,atf |
13 | ./usr/libdata/debug/usr/tests/atf/atf-c/detail tests-atf-debug | | 13 | ./usr/libdata/debug/usr/tests/atf/atf-c/detail tests-atf-debug |
14 | ./usr/libdata/debug/usr/tests/atf/atf-c/detail/dynstr_test.debug tests-atf-debug debug,atf | | 14 | ./usr/libdata/debug/usr/tests/atf/atf-c/detail/dynstr_test.debug tests-atf-debug debug,atf |
| @@ -543,26 +543,27 @@ | | | @@ -543,26 +543,27 @@ |
543 | ./usr/libdata/debug/usr/tests/lib/semaphore tests-lib-debug | | 543 | ./usr/libdata/debug/usr/tests/lib/semaphore tests-lib-debug |
544 | ./usr/libdata/debug/usr/tests/lib/semaphore/pthread tests-lib-debug | | 544 | ./usr/libdata/debug/usr/tests/lib/semaphore/pthread tests-lib-debug |
545 | ./usr/libdata/debug/usr/tests/lib/semaphore/pthread/t_sem_pth.debug tests-lib-debug debug,atf | | 545 | ./usr/libdata/debug/usr/tests/lib/semaphore/pthread/t_sem_pth.debug tests-lib-debug debug,atf |
546 | ./usr/libdata/debug/usr/tests/lib/libevent tests-lib-debug | | 546 | ./usr/libdata/debug/usr/tests/lib/libevent tests-lib-debug |
547 | ./usr/libdata/debug/usr/tests/lib/libevent/h_event.debug tests-lib-debug debug,atf | | 547 | ./usr/libdata/debug/usr/tests/lib/libevent/h_event.debug tests-lib-debug debug,atf |
548 | ./usr/libdata/debug/usr/tests/lib/libm tests-lib-debug | | 548 | ./usr/libdata/debug/usr/tests/lib/libm tests-lib-debug |
549 | ./usr/libdata/debug/usr/tests/lib/libm/t_ceil.debug tests-lib-debug debug,atf | | 549 | ./usr/libdata/debug/usr/tests/lib/libm/t_ceil.debug tests-lib-debug debug,atf |
550 | ./usr/libdata/debug/usr/tests/lib/libm/t_cos.debug tests-lib-debug debug,atf | | 550 | ./usr/libdata/debug/usr/tests/lib/libm/t_cos.debug tests-lib-debug debug,atf |
551 | ./usr/libdata/debug/usr/tests/lib/libm/t_floor.debug tests-obsolete obsolete | | 551 | ./usr/libdata/debug/usr/tests/lib/libm/t_floor.debug tests-obsolete obsolete |
552 | ./usr/libdata/debug/usr/tests/lib/libm/t_infinity.debug tests-lib-debug debug,atf | | 552 | ./usr/libdata/debug/usr/tests/lib/libm/t_infinity.debug tests-lib-debug debug,atf |
553 | ./usr/libdata/debug/usr/tests/lib/libm/t_ldexp.debug tests-lib-debug debug,atf | | 553 | ./usr/libdata/debug/usr/tests/lib/libm/t_ldexp.debug tests-lib-debug debug,atf |
554 | ./usr/libdata/debug/usr/tests/lib/libm/t_log.debug tests-lib-debug debug,atf | | 554 | ./usr/libdata/debug/usr/tests/lib/libm/t_log.debug tests-lib-debug debug,atf |
555 | ./usr/libdata/debug/usr/tests/lib/libm/t_libm.debug tests-obsolete obsolete | | 555 | ./usr/libdata/debug/usr/tests/lib/libm/t_libm.debug tests-obsolete obsolete |
| | | 556 | ./usr/libdata/debug/usr/tests/lib/libm/t_pow.debug tests-lib-debug debug,atf |
556 | ./usr/libdata/debug/usr/tests/lib/libm/t_round.debug tests-lib-debug debug,atf | | 557 | ./usr/libdata/debug/usr/tests/lib/libm/t_round.debug tests-lib-debug debug,atf |
557 | ./usr/libdata/debug/usr/tests/lib/libm/t_scalbn.debug tests-lib-debug debug,atf | | 558 | ./usr/libdata/debug/usr/tests/lib/libm/t_scalbn.debug tests-lib-debug debug,atf |
558 | ./usr/libdata/debug/usr/tests/lib/libm/t_sin.debug tests-lib-debug debug,atf | | 559 | ./usr/libdata/debug/usr/tests/lib/libm/t_sin.debug tests-lib-debug debug,atf |
559 | ./usr/libdata/debug/usr/tests/lib/libm/t_tan.debug tests-lib-debug debug,atf | | 560 | ./usr/libdata/debug/usr/tests/lib/libm/t_tan.debug tests-lib-debug debug,atf |
560 | ./usr/libdata/debug/usr/tests/lib/libm/t_tanh.debug tests-lib-debug debug,atf | | 561 | ./usr/libdata/debug/usr/tests/lib/libm/t_tanh.debug tests-lib-debug debug,atf |
561 | ./usr/libdata/debug/usr/tests/lib/libobjc tests-lib-debug | | 562 | ./usr/libdata/debug/usr/tests/lib/libobjc tests-lib-debug |
562 | ./usr/libdata/debug/usr/tests/lib/libobjc/t_threads.debug tests-lib-debug debug,atf | | 563 | ./usr/libdata/debug/usr/tests/lib/libobjc/t_threads.debug tests-lib-debug debug,atf |
563 | ./usr/libdata/debug/usr/tests/lib/libposix tests-lib-debug | | 564 | ./usr/libdata/debug/usr/tests/lib/libposix tests-lib-debug |
564 | ./usr/libdata/debug/usr/tests/lib/libposix/bsd tests-lib-debug | | 565 | ./usr/libdata/debug/usr/tests/lib/libposix/bsd tests-lib-debug |
565 | ./usr/libdata/debug/usr/tests/lib/libposix/bsd/t_rename.debug tests-lib-debug debug,atf | | 566 | ./usr/libdata/debug/usr/tests/lib/libposix/bsd/t_rename.debug tests-lib-debug debug,atf |
566 | ./usr/libdata/debug/usr/tests/lib/libposix/posix1 tests-lib-debug | | 567 | ./usr/libdata/debug/usr/tests/lib/libposix/posix1 tests-lib-debug |
567 | ./usr/libdata/debug/usr/tests/lib/libposix/posix1/t_rename.debug tests-lib-debug debug,atf | | 568 | ./usr/libdata/debug/usr/tests/lib/libposix/posix1/t_rename.debug tests-lib-debug debug,atf |
568 | ./usr/libdata/debug/usr/tests/lib/libposix/posix2 tests-lib-debug | | 569 | ./usr/libdata/debug/usr/tests/lib/libposix/posix2 tests-lib-debug |
| @@ -2252,26 +2253,27 @@ | | | @@ -2252,26 +2253,27 @@ |
2252 | ./usr/tests/lib/libevent tests-lib-tests | | 2253 | ./usr/tests/lib/libevent tests-lib-tests |
2253 | ./usr/tests/lib/libevent/Atffile tests-lib-tests atf | | 2254 | ./usr/tests/lib/libevent/Atffile tests-lib-tests atf |
2254 | ./usr/tests/lib/libevent/h_event tests-lib-tests atf | | 2255 | ./usr/tests/lib/libevent/h_event tests-lib-tests atf |
2255 | ./usr/tests/lib/libevent/t_event tests-lib-tests atf | | 2256 | ./usr/tests/lib/libevent/t_event tests-lib-tests atf |
2256 | ./usr/tests/lib/libm tests-lib-tests atf | | 2257 | ./usr/tests/lib/libm tests-lib-tests atf |
2257 | ./usr/tests/lib/libm/Atffile tests-lib-tests atf | | 2258 | ./usr/tests/lib/libm/Atffile tests-lib-tests atf |
2258 | ./usr/tests/lib/libm/t_ceil tests-lib-tests atf | | 2259 | ./usr/tests/lib/libm/t_ceil tests-lib-tests atf |
2259 | ./usr/tests/lib/libm/t_cos tests-lib-tests atf | | 2260 | ./usr/tests/lib/libm/t_cos tests-lib-tests atf |
2260 | ./usr/tests/lib/libm/t_floor tests-obsolete obsolete | | 2261 | ./usr/tests/lib/libm/t_floor tests-obsolete obsolete |
2261 | ./usr/tests/lib/libm/t_infinity tests-lib-tests atf | | 2262 | ./usr/tests/lib/libm/t_infinity tests-lib-tests atf |
2262 | ./usr/tests/lib/libm/t_ldexp tests-lib-tests atf | | 2263 | ./usr/tests/lib/libm/t_ldexp tests-lib-tests atf |
2263 | ./usr/tests/lib/libm/t_log tests-lib-tests atf | | 2264 | ./usr/tests/lib/libm/t_log tests-lib-tests atf |
2264 | ./usr/tests/lib/libm/t_libm tests-obsolete obsolete | | 2265 | ./usr/tests/lib/libm/t_libm tests-obsolete obsolete |
| | | 2266 | ./usr/tests/lib/libm/t_pow tests-lib-tests atf |
2265 | ./usr/tests/lib/libm/t_round tests-lib-tests atf | | 2267 | ./usr/tests/lib/libm/t_round tests-lib-tests atf |
2266 | ./usr/tests/lib/libm/t_scalbn tests-lib-tests atf | | 2268 | ./usr/tests/lib/libm/t_scalbn tests-lib-tests atf |
2267 | ./usr/tests/lib/libm/t_sin tests-lib-tests atf | | 2269 | ./usr/tests/lib/libm/t_sin tests-lib-tests atf |
2268 | ./usr/tests/lib/libm/t_tan tests-lib-tests atf | | 2270 | ./usr/tests/lib/libm/t_tan tests-lib-tests atf |
2269 | ./usr/tests/lib/libm/t_tanh tests-lib-tests atf | | 2271 | ./usr/tests/lib/libm/t_tanh tests-lib-tests atf |
2270 | ./usr/tests/lib/libobjc tests-lib-tests atf | | 2272 | ./usr/tests/lib/libobjc tests-lib-tests atf |
2271 | ./usr/tests/lib/libobjc/Atffile tests-lib-tests atf | | 2273 | ./usr/tests/lib/libobjc/Atffile tests-lib-tests atf |
2272 | ./usr/tests/lib/libobjc/t_threads tests-lib-tests atf | | 2274 | ./usr/tests/lib/libobjc/t_threads tests-lib-tests atf |
2273 | ./usr/tests/lib/libposix tests-lib-tests atf | | 2275 | ./usr/tests/lib/libposix tests-lib-tests atf |
2274 | ./usr/tests/lib/libposix/Atffile tests-lib-tests atf | | 2276 | ./usr/tests/lib/libposix/Atffile tests-lib-tests atf |
2275 | ./usr/tests/lib/libposix/bsd tests-lib-tests atf | | 2277 | ./usr/tests/lib/libposix/bsd tests-lib-tests atf |
2276 | ./usr/tests/lib/libposix/bsd/Atffile tests-lib-tests atf | | 2278 | ./usr/tests/lib/libposix/bsd/Atffile tests-lib-tests atf |
2277 | ./usr/tests/lib/libposix/bsd/t_rename tests-lib-tests atf | | 2279 | ./usr/tests/lib/libposix/bsd/t_rename tests-lib-tests atf |
--- src/tests/lib/libm/Makefile 2011/09/14 05:18:19 1.9
+++ src/tests/lib/libm/Makefile 2011/09/17 08:15:43 1.10
| @@ -1,21 +1,22 @@ | | | @@ -1,21 +1,22 @@ |
1 | # $NetBSD: Makefile,v 1.9 2011/09/14 05:18:19 jruoho Exp $ | | 1 | # $NetBSD: Makefile,v 1.10 2011/09/17 08:15:43 jruoho Exp $ |
2 | | | 2 | |
3 | .include <bsd.own.mk> | | 3 | .include <bsd.own.mk> |
4 | | | 4 | |
5 | TESTSDIR= ${TESTSBASE}/lib/libm | | 5 | TESTSDIR= ${TESTSBASE}/lib/libm |
6 | | | 6 | |
7 | TESTS_C+= t_ceil | | 7 | TESTS_C+= t_ceil |
8 | TESTS_C+= t_cos | | 8 | TESTS_C+= t_cos |
9 | TESTS_C+= t_infinity | | 9 | TESTS_C+= t_infinity |
10 | TESTS_C+= t_ldexp | | 10 | TESTS_C+= t_ldexp |
11 | TESTS_C+= t_log | | 11 | TESTS_C+= t_log |
| | | 12 | TESTS_C+= t_pow |
12 | TESTS_C+= t_round | | 13 | TESTS_C+= t_round |
13 | TESTS_C+= t_scalbn | | 14 | TESTS_C+= t_scalbn |
14 | TESTS_C+= t_sin | | 15 | TESTS_C+= t_sin |
15 | TESTS_C+= t_tan | | 16 | TESTS_C+= t_tan |
16 | TESTS_C+= t_tanh | | 17 | TESTS_C+= t_tanh |
17 | | | 18 | |
18 | LDADD+= -lm | | 19 | LDADD+= -lm |
19 | #COPTS+= -Wfloat-equal | | 20 | #COPTS+= -Wfloat-equal |
20 | | | 21 | |
21 | .include <bsd.test.mk> | | 22 | .include <bsd.test.mk> |
/* $NetBSD: t_pow.c,v 1.1 2011/09/17 08:15:43 jruoho Exp $ */
/*-
* Copyright (c) 2011 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Jukka Ruohonen.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
__RCSID("$NetBSD: t_pow.c,v 1.1 2011/09/17 08:15:43 jruoho Exp $");
#include <atf-c.h>
#include <math.h>
/*
* pow(3)
*/
ATF_TC(pow_nan_x);
ATF_TC_HEAD(pow_nan_x, tc)
{
atf_tc_set_md_var(tc, "descr", "Test pow(NaN, y) == NaN");
}
ATF_TC_BODY(pow_nan_x, tc)
{
#ifndef __vax__
const double x = 0.0L / 0.0L;
ATF_CHECK(isnan(pow(x, 2.0)) != 0);
#endif
}
ATF_TC(pow_nan_y);
ATF_TC_HEAD(pow_nan_y, tc)
{
atf_tc_set_md_var(tc, "descr", "Test pow(x, NaN) == NaN");
}
ATF_TC_BODY(pow_nan_y, tc)
{
#ifndef __vax__
const double y = 0.0L / 0.0L;
ATF_CHECK(isnan(pow(2.0, y)) != 0);
#endif
}
ATF_TC(pow_inf_neg_x);
ATF_TC_HEAD(pow_inf_neg_x, tc)
{
atf_tc_set_md_var(tc, "descr", "Test pow(-Inf, y) == +-Inf || +-0.0");
}
ATF_TC_BODY(pow_inf_neg_x, tc)
{
#ifndef __vax__
const double x = -1.0L / 0.0L;
double z;
/*
* If y is odd, y > 0, and x is -Inf, -Inf is returned.
* If y is even, y > 0, and x is -Inf, +Inf is returned.
*/
z = pow(x, 3.0);
if (isinf(z) == 0 || signbit(z) == 0)
atf_tc_fail_nonfatal("pow(-Inf, 3.0) != -Inf");
z = pow(x, 4.0);
if (isinf(z) == 0 || signbit(z) != 0)
atf_tc_fail_nonfatal("pow(-Inf, 4.0) != +Inf");
/*
* If y is odd, y < 0, and x is -Inf, -0.0 is returned.
* If y is even, y < 0, and x is -Inf, +0.0 is returned.
*/
z = pow(x, -3.0);
if (fabs(z) > 0.0 || signbit(z) == 0)
atf_tc_fail_nonfatal("pow(-Inf, -3.0) != -0.0");
z = pow(x, -4.0);
if (fabs(z) > 0.0 || signbit(z) != 0)
atf_tc_fail_nonfatal("pow(-Inf -4.0) != +0.0");
#endif
}
ATF_TC(pow_inf_neg_y);
ATF_TC_HEAD(pow_inf_neg_y, tc)
{
atf_tc_set_md_var(tc, "descr", "Test pow(x, -Inf) == +Inf || +0.0");
}
ATF_TC_BODY(pow_inf_neg_y, tc)
{
#ifndef __vax__
const double y = -1.0L / 0.0L;
double z;
/*
* If |x| < 1 and y is -Inf, +Inf is returned.
* If |x| > 1 and y is -Inf, +0.0 is returned.
*/
z = pow(0.1, y);
if (isinf(z) == 0 || signbit(z) != 0)
atf_tc_fail_nonfatal("pow(0.1, -Inf) != +Inf");
z = pow(1.1, y);
if (fabs(z) > 0.0 || signbit(z) != 0)
atf_tc_fail_nonfatal("pow(1.1, -Inf) != +0.0");
#endif
}
ATF_TC(pow_inf_pos_x);
ATF_TC_HEAD(pow_inf_pos_x, tc)
{
atf_tc_set_md_var(tc, "descr", "Test pow(+Inf, y) == +Inf || +0.0");
}
ATF_TC_BODY(pow_inf_pos_x, tc)
{
#ifndef __vax__
const double x = 1.0L / 0.0L;
double z;
/*
* For y < 0, if x is +Inf, +0.0 is returned.
* For y > 0, if x is +Inf, +Inf is returned.
*/
z = pow(x, -2.0);
if (fabs(z) > 0.0 || signbit(z) != 0)
atf_tc_fail_nonfatal("pow(+Inf, -2.0) != +0.0");
z = pow(x, 2.0);
if (isinf(z) == 0 || signbit(z) != 0)
atf_tc_fail_nonfatal("pow(+Inf, 2.0) != +Inf");
#endif
}
ATF_TC(pow_inf_pos_y);
ATF_TC_HEAD(pow_inf_pos_y, tc)
{
atf_tc_set_md_var(tc, "descr", "Test pow(x, +Inf) == +Inf || +0.0");
}
ATF_TC_BODY(pow_inf_pos_y, tc)
{
#ifndef __vax__
const double y = 1.0L / 0.0L;
double z;
/*
* If |x| < 1 and y is +Inf, +0.0 is returned.
* If |x| > 1 and y is +Inf, +Inf is returned.
*/
z = pow(0.1, y);
if (fabs(z) > 0.0 || signbit(z) != 0)
atf_tc_fail_nonfatal("pow(0.1, +Inf) != +0.0");
z = pow(1.1, y);
if (isinf(z) == 0 || signbit(z) != 0)
atf_tc_fail_nonfatal("pow(1.1, +Inf) != +Inf");
#endif
}
ATF_TC(pow_one_neg_x);
ATF_TC_HEAD(pow_one_neg_x, tc)
{
atf_tc_set_md_var(tc, "descr", "Test pow(-1.0, +-Inf) == 1.0");
}
ATF_TC_BODY(pow_one_neg_x, tc)
{
#ifndef __vax__
const double infp = 1.0L / 0.0L;
const double infn = -1.0L / 0.0L;
/*
* If x is -1.0, and y is +-Inf, 1.0 shall be returned.
*/
ATF_REQUIRE(isinf(infp) != 0);
ATF_REQUIRE(isinf(infn) != 0);
if (pow(-1.0, infp) != 1.0) {
atf_tc_expect_fail("PR lib/45372");
atf_tc_fail_nonfatal("pow(-1.0, +Inf) != 1.0");
}
if (pow(-1.0, infn) != 1.0) {
atf_tc_expect_fail("PR lib/45372");
atf_tc_fail_nonfatal("pow(-1.0, -Inf) != 1.0");
}
#endif
}
ATF_TC(pow_one_pos_x);
ATF_TC_HEAD(pow_one_pos_x, tc)
{
atf_tc_set_md_var(tc, "descr", "Test pow(1.0, y) == 1.0");
}
ATF_TC_BODY(pow_one_pos_x, tc)
{
#ifndef __vax__
const double y[] = { 0.0, 0.1, 2.0, -3.0, 99.0, 99.99, 9999999.9 };
const double z = 0.0L / 0.0L;
size_t i;
/*
* For any value of y (including NaN),
* if x is 1.0, 1.0 shall be returned.
*/
if (pow(1.0, z) != 1.0)
atf_tc_fail_nonfatal("pow(1.0, NaN) != 1.0");
for (i = 0; i < __arraycount(y); i++) {
if (pow(1.0, y[i]) != 1.0)
atf_tc_fail_nonfatal("pow(1.0, %0.01f) != 1.0", y[i]);
}
#endif
}
ATF_TC(pow_zero_x);
ATF_TC_HEAD(pow_zero_x, tc)
{
atf_tc_set_md_var(tc, "descr", "Test pow(+-0.0, y) == +-0.0 || HUGE");
}
ATF_TC_BODY(pow_zero_x, tc)
{
#ifndef __vax__
double z;
/*
* If x is +0.0 or -0.0, y > 0, and y
* is an odd integer, x is returned.
*/
z = pow(+0.0, 3.0);
if (fabs(z) > 0.0 || signbit(z) != 0)
atf_tc_fail_nonfatal("pow(+0.0, 3.0) != +0.0");
z = pow(-0.0, 3.0);
if (fabs(z) > 0.0 || signbit(z) == 0)
atf_tc_fail_nonfatal("pow(-0.0, 3.0) != -0.0");
/*
* If y > 0 and not an odd integer,
* if x is +0.0 or -0.0, +0.0 is returned.
*/
z = pow(+0.0, 4.0);
if (fabs(z) > 0.0 || signbit(z) != 0)
atf_tc_fail_nonfatal("pow(+0.0, 4.0) != +0.0");
z = pow(-0.0, 4.0);
if (fabs(z) > 0.0 || signbit(z) != 0)
atf_tc_fail_nonfatal("pow(-0.0, 4.0) != +0.0");
/*
* If y < 0 and x is +0.0 or -0.0, either +-HUGE_VAL,
* +-HUGE_VALF, or +-HUGE_VALL shall be returned.
*/
z = pow(+0.0, -4.0);
if (z != -HUGE_VAL)
atf_tc_fail_nonfatal("pow(+0.0, -4.0) != -HUGE_VAL");
z = pow(-0.0, -4.0);
if (z != -HUGE_VAL)
atf_tc_fail_nonfatal("pow(-0.0, -4.0) != -HUGE_VAL");
#endif
}
ATF_TC(pow_zero_y);
ATF_TC_HEAD(pow_zero_y, tc)
{
atf_tc_set_md_var(tc, "descr", "Test pow(x, +-0.0) == 1.0");
}
ATF_TC_BODY(pow_zero_y, tc)
{
#ifndef __vax__
const double x[] = { 0.1, -3.0, 77.0, 99.99, 101.0000001 };
const double z = 0.0L / 0.0L;
size_t i;
/*
* For any value of x (including NaN),
* if y is +0.0 or -0.0, 1.0 is returned.
*/
if (pow(z, +0.0) != 1.0)
atf_tc_fail_nonfatal("pow(NaN, +0.0) != 1.0");
if (pow(z, -0.0) != 1.0)
atf_tc_fail_nonfatal("pow(NaN, -0.0) != 1.0");
for (i = 0; i < __arraycount(x); i++) {
if (pow(x[i], +0.0) != 1.0)
atf_tc_fail_nonfatal("pow(%0.01f, +0.0) != 1.0", x[i]);
if (pow(x[i], -0.0) != 1.0)
atf_tc_fail_nonfatal("pow(%0.01f, -0.0) != 1.0", x[i]);
}
#endif
}
/*
* powf(3)
*/
ATF_TC(powf_nan_x);
ATF_TC_HEAD(powf_nan_x, tc)
{
atf_tc_set_md_var(tc, "descr", "Test powf(NaN, y) == NaN");
}
ATF_TC_BODY(powf_nan_x, tc)
{
#ifndef __vax__
const float x = 0.0L / 0.0L;
ATF_CHECK(isnanf(powf(x, 2.0)) != 0);
#endif
}
ATF_TC(powf_nan_y);
ATF_TC_HEAD(powf_nan_y, tc)
{
atf_tc_set_md_var(tc, "descr", "Test powf(x, NaN) == NaN");
}
ATF_TC_BODY(powf_nan_y, tc)
{
#ifndef __vax__
const float y = 0.0L / 0.0L;
ATF_CHECK(isnanf(powf(2.0, y)) != 0);
#endif
}
ATF_TC(powf_inf_neg_x);
ATF_TC_HEAD(powf_inf_neg_x, tc)
{
atf_tc_set_md_var(tc, "descr", "Test powf(-Inf, y) == +-Inf || +-0.0");
}
ATF_TC_BODY(powf_inf_neg_x, tc)
{
#ifndef __vax__
const float x = -1.0L / 0.0L;
float z;
/*
* If y is odd, y > 0, and x is -Inf, -Inf is returned.
* If y is even, y > 0, and x is -Inf, +Inf is returned.
*/
z = powf(x, 3.0);
if (isinff(z) == 0 || signbit(z) == 0)
atf_tc_fail_nonfatal("powf(-Inf, 3.0) != -Inf");
z = powf(x, 4.0);
if (isinff(z) == 0 || signbit(z) != 0)
atf_tc_fail_nonfatal("powf(-Inf, 4.0) != +Inf");
/*
* If y is odd, y < 0, and x is -Inf, -0.0 is returned.
* If y is even, y < 0, and x is -Inf, +0.0 is returned.
*/
z = powf(x, -3.0);
if (fabsf(z) > 0.0 || signbit(z) == 0) {
atf_tc_expect_fail("PR lib/45372");
atf_tc_fail_nonfatal("powf(-Inf, -3.0) != -0.0");
}
z = powf(x, -4.0);
if (fabsf(z) > 0.0 || signbit(z) != 0)
atf_tc_fail_nonfatal("powf(-Inf -4.0) != +0.0");
#endif
}
ATF_TC(powf_inf_neg_y);
ATF_TC_HEAD(powf_inf_neg_y, tc)
{
atf_tc_set_md_var(tc, "descr", "Test powf(x, -Inf) == +Inf || +0.0");
}
ATF_TC_BODY(powf_inf_neg_y, tc)
{
#ifndef __vax__
const float y = -1.0L / 0.0L;
float z;
/*
* If |x| < 1 and y is -Inf, +Inf is returned.
* If |x| > 1 and y is -Inf, +0.0 is returned.
*/
z = powf(0.1, y);
if (isinff(z) == 0 || signbit(z) != 0)
atf_tc_fail_nonfatal("powf(0.1, -Inf) != +Inf");
z = powf(1.1, y);
if (fabsf(z) > 0.0 || signbit(z) != 0)
atf_tc_fail_nonfatal("powf(1.1, -Inf) != +0.0");
#endif
}
ATF_TC(powf_inf_pos_x);
ATF_TC_HEAD(powf_inf_pos_x, tc)
{
atf_tc_set_md_var(tc, "descr", "Test powf(+Inf, y) == +Inf || +0.0");
}
ATF_TC_BODY(powf_inf_pos_x, tc)
{
#ifndef __vax__
const float x = 1.0L / 0.0L;
float z;
/*
* For y < 0, if x is +Inf, +0.0 is returned.
* For y > 0, if x is +Inf, +Inf is returned.
*/
z = powf(x, -2.0);
if (fabsf(z) > 0.0 || signbit(z) != 0)
atf_tc_fail_nonfatal("powf(+Inf, -2.0) != +0.0");
z = powf(x, 2.0);
if (isinff(z) == 0 || signbit(z) != 0)
atf_tc_fail_nonfatal("powf(+Inf, 2.0) != +Inf");
#endif
}
ATF_TC(powf_inf_pos_y);
ATF_TC_HEAD(powf_inf_pos_y, tc)
{
atf_tc_set_md_var(tc, "descr", "Test powf(x, +Inf) == +Inf || +0.0");
}
ATF_TC_BODY(powf_inf_pos_y, tc)
{
#ifndef __vax__
const float y = 1.0L / 0.0L;
float z;
/*
* If |x| < 1 and y is +Inf, +0.0 is returned.
* If |x| > 1 and y is +Inf, +Inf is returned.
*/
z = powf(0.1, y);
if (fabsf(z) > 0.0 || signbit(z) != 0)
atf_tc_fail_nonfatal("powf(0.1, +Inf) != +0.0");
z = powf(1.1, y);
if (isinff(z) == 0 || signbit(z) != 0)
atf_tc_fail_nonfatal("powf(1.1, +Inf) != +Inf");
#endif
}
ATF_TC(powf_one_neg_x);
ATF_TC_HEAD(powf_one_neg_x, tc)
{
atf_tc_set_md_var(tc, "descr", "Test powf(-1.0, +-Inf) == 1.0");
}
ATF_TC_BODY(powf_one_neg_x, tc)
{
#ifndef __vax__
const float infp = 1.0L / 0.0L;
const float infn = -1.0L / 0.0L;
/*
* If x is -1.0, and y is +-Inf, 1.0 shall be returned.
*/
ATF_REQUIRE(isinff(infp) != 0);
ATF_REQUIRE(isinff(infn) != 0);
if (powf(-1.0, infp) != 1.0) {
atf_tc_expect_fail("PR lib/45372");
atf_tc_fail_nonfatal("powf(-1.0, +Inf) != 1.0");
}
if (powf(-1.0, infn) != 1.0) {
atf_tc_expect_fail("PR lib/45372");
atf_tc_fail_nonfatal("powf(-1.0, -Inf) != 1.0");
}
#endif
}
ATF_TC(powf_one_pos_x);
ATF_TC_HEAD(powf_one_pos_x, tc)
{
atf_tc_set_md_var(tc, "descr", "Test powf(1.0, y) == 1.0");
}
ATF_TC_BODY(powf_one_pos_x, tc)
{
#ifndef __vax__
const float y[] = { 0.0, 0.1, 2.0, -3.0, 99.0, 99.99, 9999999.9 };
const float z = 0.0L / 0.0L;
size_t i;
/*
* For any value of y (including NaN),
* if x is 1.0, 1.0 shall be returned.
*/
if (powf(1.0, z) != 1.0)
atf_tc_fail_nonfatal("powf(1.0, NaN) != 1.0");
for (i = 0; i < __arraycount(y); i++) {
if (powf(1.0, y[i]) != 1.0)
atf_tc_fail_nonfatal("powf(1.0, %0.01f) != 1.0", y[i]);
}
#endif
}
ATF_TC(powf_zero_x);
ATF_TC_HEAD(powf_zero_x, tc)
{
atf_tc_set_md_var(tc, "descr", "Test powf(+-0.0, y) == +-0.0 || HUGE");
}
ATF_TC_BODY(powf_zero_x, tc)
{
#ifndef __vax__
float z;
/*
* If x is +0.0 or -0.0, y > 0, and y
* is an odd integer, x is returned.
*/
z = powf(+0.0, 3.0);
if (fabsf(z) > 0.0 || signbit(z) != 0)
atf_tc_fail_nonfatal("powf(+0.0, 3.0) != +0.0");
z = powf(-0.0, 3.0);
if (fabsf(z) > 0.0 || signbit(z) == 0)
atf_tc_fail_nonfatal("powf(-0.0, 3.0) != -0.0");
/*
* If y > 0 and not an odd integer,
* if x is +0.0 or -0.0, +0.0 is returned.
*/
z = powf(+0.0, 4.0);
if (fabsf(z) > 0.0 || signbit(z) != 0)
atf_tc_fail_nonfatal("powf(+0.0, 4.0) != +0.0");
z = powf(-0.0, 4.0);
if (fabsf(z) > 0.0 || signbit(z) != 0)
atf_tc_fail_nonfatal("powf(-0.0, 4.0) != +0.0");
/*
* If y < 0 and x is +0.0 or -0.0, either +-HUGE_VAL,
* +-HUGE_VALF, or +-HUGE_VALL shall be returned.
*/
z = powf(+0.0, -4.0);
if (z != -HUGE_VAL)
atf_tc_fail_nonfatal("powf(+0.0, -4.0) != -HUGE_VAL");
z = powf(-0.0, -4.0);
if (z != -HUGE_VAL)
atf_tc_fail_nonfatal("powf(-0.0, -4.0) != -HUGE_VAL");
#endif
}
ATF_TC(powf_zero_y);
ATF_TC_HEAD(powf_zero_y, tc)
{
atf_tc_set_md_var(tc, "descr", "Test powf(x, +-0.0) == 1.0");
}
ATF_TC_BODY(powf_zero_y, tc)
{
#ifndef __vax__
const float x[] = { 0.1, -3.0, 77.0, 99.99, 101.0000001 };
const float z = 0.0L / 0.0L;
size_t i;
/*
* For any value of x (including NaN),
* if y is +0.0 or -0.0, 1.0 is returned.
*/
if (powf(z, +0.0) != 1.0)
atf_tc_fail_nonfatal("powf(NaN, +0.0) != 1.0");
if (powf(z, -0.0) != 1.0)
atf_tc_fail_nonfatal("powf(NaN, -0.0) != 1.0");
for (i = 0; i < __arraycount(x); i++) {
if (powf(x[i], +0.0) != 1.0)
atf_tc_fail_nonfatal("powf(%0.01f, +0.0) != 1.0",x[i]);
if (powf(x[i], -0.0) != 1.0)
atf_tc_fail_nonfatal("powf(%0.01f, -0.0) != 1.0",x[i]);
}
#endif
}
ATF_TP_ADD_TCS(tp)
{
ATF_TP_ADD_TC(tp, pow_nan_x);
ATF_TP_ADD_TC(tp, pow_nan_y);
ATF_TP_ADD_TC(tp, pow_inf_neg_x);
ATF_TP_ADD_TC(tp, pow_inf_neg_y);
ATF_TP_ADD_TC(tp, pow_inf_pos_x);
ATF_TP_ADD_TC(tp, pow_inf_pos_y);
ATF_TP_ADD_TC(tp, pow_one_neg_x);
ATF_TP_ADD_TC(tp, pow_one_pos_x);
ATF_TP_ADD_TC(tp, pow_zero_x);
ATF_TP_ADD_TC(tp, pow_zero_y);
ATF_TP_ADD_TC(tp, powf_nan_x);
ATF_TP_ADD_TC(tp, powf_nan_y);
ATF_TP_ADD_TC(tp, powf_inf_neg_x);
ATF_TP_ADD_TC(tp, powf_inf_neg_y);
ATF_TP_ADD_TC(tp, powf_inf_pos_x);
ATF_TP_ADD_TC(tp, powf_inf_pos_y);
ATF_TP_ADD_TC(tp, powf_one_neg_x);
ATF_TP_ADD_TC(tp, powf_one_pos_x);
ATF_TP_ADD_TC(tp, powf_zero_x);
ATF_TP_ADD_TC(tp, powf_zero_y);
return atf_no_error();
}