t_acos.c revision 1.2
11.2Sjruoho/* $NetBSD: t_acos.c,v 1.2 2011/09/18 04:48:38 jruoho Exp $ */
21.1Sjruoho
31.1Sjruoho/*-
41.1Sjruoho * Copyright (c) 2011 The NetBSD Foundation, Inc.
51.1Sjruoho * All rights reserved.
61.1Sjruoho *
71.1Sjruoho * This code is derived from software contributed to The NetBSD Foundation
81.1Sjruoho * by Jukka Ruohonen.
91.1Sjruoho *
101.1Sjruoho * Redistribution and use in source and binary forms, with or without
111.1Sjruoho * modification, are permitted provided that the following conditions
121.1Sjruoho * are met:
131.1Sjruoho * 1. Redistributions of source code must retain the above copyright
141.1Sjruoho *    notice, this list of conditions and the following disclaimer.
151.1Sjruoho * 2. Redistributions in binary form must reproduce the above copyright
161.1Sjruoho *    notice, this list of conditions and the following disclaimer in the
171.1Sjruoho *    documentation and/or other materials provided with the distribution.
181.1Sjruoho *
191.1Sjruoho * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
201.1Sjruoho * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
211.1Sjruoho * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
221.1Sjruoho * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
231.1Sjruoho * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
241.1Sjruoho * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
251.1Sjruoho * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
261.1Sjruoho * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
271.1Sjruoho * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
281.1Sjruoho * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
291.1Sjruoho * POSSIBILITY OF SUCH DAMAGE.
301.1Sjruoho */
311.1Sjruoho
321.1Sjruoho#include <atf-c.h>
331.1Sjruoho#include <math.h>
341.1Sjruoho
351.1Sjruoho/*
361.1Sjruoho * acos(3)
371.1Sjruoho */
381.1SjruohoATF_TC(acos_nan);
391.1SjruohoATF_TC_HEAD(acos_nan, tc)
401.1Sjruoho{
411.1Sjruoho	atf_tc_set_md_var(tc, "descr", "Test acos(NaN) == NaN");
421.1Sjruoho}
431.1Sjruoho
441.1SjruohoATF_TC_BODY(acos_nan, tc)
451.1Sjruoho{
461.1Sjruoho#ifndef __vax__
471.1Sjruoho	const double x = 0.0L / 0.0L;
481.1Sjruoho
491.1Sjruoho	if (isnan(acos(x)) == 0)
501.1Sjruoho		atf_tc_fail_nonfatal("acos(NaN) != NaN");
511.1Sjruoho#endif
521.1Sjruoho}
531.1Sjruoho
541.1SjruohoATF_TC(acos_inf_neg);
551.1SjruohoATF_TC_HEAD(acos_inf_neg, tc)
561.1Sjruoho{
571.1Sjruoho	atf_tc_set_md_var(tc, "descr", "Test acos(-Inf) == NaN");
581.1Sjruoho}
591.1Sjruoho
601.1SjruohoATF_TC_BODY(acos_inf_neg, tc)
611.1Sjruoho{
621.1Sjruoho#ifndef __vax__
631.1Sjruoho	const double x = -1.0L / 0.0L;
641.1Sjruoho
651.1Sjruoho	if (isnan(acos(x)) == 0)
661.1Sjruoho		atf_tc_fail_nonfatal("acos(-Inf) != NaN");
671.1Sjruoho#endif
681.1Sjruoho}
691.1Sjruoho
701.1SjruohoATF_TC(acos_inf_pos);
711.1SjruohoATF_TC_HEAD(acos_inf_pos, tc)
721.1Sjruoho{
731.1Sjruoho	atf_tc_set_md_var(tc, "descr", "Test acos(+Inf) == NaN");
741.1Sjruoho}
751.1Sjruoho
761.1SjruohoATF_TC_BODY(acos_inf_pos, tc)
771.1Sjruoho{
781.1Sjruoho#ifndef __vax__
791.1Sjruoho	const double x = 1.0L / 0.0L;
801.1Sjruoho
811.1Sjruoho	if (isnan(acos(x)) == 0)
821.1Sjruoho		atf_tc_fail_nonfatal("acos(+Inf) != NaN");
831.1Sjruoho#endif
841.1Sjruoho}
851.1Sjruoho
861.1SjruohoATF_TC(acos_one_pos);
871.1SjruohoATF_TC_HEAD(acos_one_pos, tc)
881.1Sjruoho{
891.1Sjruoho	atf_tc_set_md_var(tc, "descr", "Test acos(1.0) == +0.0");
901.1Sjruoho}
911.1Sjruoho
921.1SjruohoATF_TC_BODY(acos_one_pos, tc)
931.1Sjruoho{
941.1Sjruoho#ifndef __vax__
951.1Sjruoho	const double y = acos(1.0);
961.1Sjruoho
971.1Sjruoho	if (fabs(y) > 0.0 || signbit(y) != 0)
981.1Sjruoho		atf_tc_fail_nonfatal("acos(1.0) != +0.0");
991.1Sjruoho#endif
1001.1Sjruoho}
1011.1Sjruoho
1021.1SjruohoATF_TC(acos_range);
1031.1SjruohoATF_TC_HEAD(acos_range, tc)
1041.1Sjruoho{
1051.1Sjruoho	atf_tc_set_md_var(tc, "descr", "Test acos(x) == NaN, x < -1, x > 1");
1061.1Sjruoho}
1071.1Sjruoho
1081.1SjruohoATF_TC_BODY(acos_range, tc)
1091.1Sjruoho{
1101.1Sjruoho#ifndef __vax__
1111.1Sjruoho	const double x[] = { -1.1, -1.000000001, 1.1, 1.000000001 };
1121.1Sjruoho	size_t i;
1131.1Sjruoho
1141.1Sjruoho	for (i = 0; i < __arraycount(x); i++) {
1151.1Sjruoho
1161.1Sjruoho		if (isnan(acos(x[i])) == 0)
1171.1Sjruoho			atf_tc_fail_nonfatal("acos(%f) != NaN", x[i]);
1181.1Sjruoho	}
1191.1Sjruoho#endif
1201.1Sjruoho}
1211.1Sjruoho
1221.1SjruohoATF_TC(acos_cos);
1231.1SjruohoATF_TC_HEAD(acos_cos, tc)
1241.1Sjruoho{
1251.1Sjruoho	atf_tc_set_md_var(tc, "descr", "Test acos(cos(x)) == x");
1261.1Sjruoho}
1271.1Sjruoho
1281.1SjruohoATF_TC_BODY(acos_cos, tc)
1291.1Sjruoho{
1301.1Sjruoho#ifndef __vax__
1311.1Sjruoho	const double x[] = { 0.0, 1.0, M_PI / 2, M_PI / 3, M_PI / 6 };
1321.1Sjruoho	const double eps = 1.0e-15;
1331.1Sjruoho	double y;
1341.1Sjruoho	size_t i;
1351.1Sjruoho
1361.1Sjruoho	for (i = 0; i < __arraycount(x); i++) {
1371.1Sjruoho
1381.1Sjruoho		y = acos(cos(x[i]));
1391.1Sjruoho
1401.1Sjruoho		if (fabs(y - x[i]) > eps)
1411.1Sjruoho			atf_tc_fail_nonfatal("acos(cos(%0.03f)) != %0.03f",
1421.1Sjruoho			    x[i], x[i]);
1431.1Sjruoho	}
1441.1Sjruoho#endif
1451.1Sjruoho}
1461.1Sjruoho
1471.1Sjruoho/*
1481.1Sjruoho * acosf(3)
1491.1Sjruoho */
1501.1SjruohoATF_TC(acosf_nan);
1511.1SjruohoATF_TC_HEAD(acosf_nan, tc)
1521.1Sjruoho{
1531.1Sjruoho	atf_tc_set_md_var(tc, "descr", "Test acosf(NaN) == NaN");
1541.1Sjruoho}
1551.1Sjruoho
1561.1SjruohoATF_TC_BODY(acosf_nan, tc)
1571.1Sjruoho{
1581.1Sjruoho#ifndef __vax__
1591.1Sjruoho	const float x = 0.0L / 0.0L;
1601.1Sjruoho
1611.1Sjruoho	if (isnan(acosf(x)) == 0)
1621.1Sjruoho		atf_tc_fail_nonfatal("acosf(NaN) != NaN");
1631.1Sjruoho#endif
1641.1Sjruoho}
1651.1Sjruoho
1661.1SjruohoATF_TC(acosf_inf_neg);
1671.1SjruohoATF_TC_HEAD(acosf_inf_neg, tc)
1681.1Sjruoho{
1691.1Sjruoho	atf_tc_set_md_var(tc, "descr", "Test acosf(-Inf) == NaN");
1701.1Sjruoho}
1711.1Sjruoho
1721.1SjruohoATF_TC_BODY(acosf_inf_neg, tc)
1731.1Sjruoho{
1741.1Sjruoho#ifndef __vax__
1751.1Sjruoho	const float x = -1.0L / 0.0L;
1761.1Sjruoho
1771.1Sjruoho	if (isnan(acosf(x)) == 0)
1781.1Sjruoho		atf_tc_fail_nonfatal("acosf(-Inf) != NaN");
1791.1Sjruoho#endif
1801.1Sjruoho}
1811.1Sjruoho
1821.1SjruohoATF_TC(acosf_inf_pos);
1831.1SjruohoATF_TC_HEAD(acosf_inf_pos, tc)
1841.1Sjruoho{
1851.1Sjruoho	atf_tc_set_md_var(tc, "descr", "Test acosf(+Inf) == NaN");
1861.1Sjruoho}
1871.1Sjruoho
1881.1SjruohoATF_TC_BODY(acosf_inf_pos, tc)
1891.1Sjruoho{
1901.1Sjruoho#ifndef __vax__
1911.1Sjruoho	const float x = 1.0L / 0.0L;
1921.1Sjruoho
1931.1Sjruoho	if (isnan(acosf(x)) == 0)
1941.1Sjruoho		atf_tc_fail_nonfatal("acosf(+Inf) != NaN");
1951.1Sjruoho#endif
1961.1Sjruoho}
1971.1Sjruoho
1981.1SjruohoATF_TC(acosf_one_pos);
1991.1SjruohoATF_TC_HEAD(acosf_one_pos, tc)
2001.1Sjruoho{
2011.1Sjruoho	atf_tc_set_md_var(tc, "descr", "Test acosf(1.0) == +0.0");
2021.1Sjruoho}
2031.1Sjruoho
2041.1SjruohoATF_TC_BODY(acosf_one_pos, tc)
2051.1Sjruoho{
2061.1Sjruoho#ifndef __vax__
2071.1Sjruoho	const float y = acosf(1.0);
2081.1Sjruoho
2091.1Sjruoho	if (fabsf(y) > 0.0 || signbit(y) != 0)
2101.1Sjruoho		atf_tc_fail_nonfatal("acosf(1.0) != +0.0");
2111.1Sjruoho#endif
2121.1Sjruoho}
2131.1Sjruoho
2141.1SjruohoATF_TC(acosf_range);
2151.1SjruohoATF_TC_HEAD(acosf_range, tc)
2161.1Sjruoho{
2171.1Sjruoho	atf_tc_set_md_var(tc, "descr", "Test acosf(x) == NaN, x < -1, x > 1");
2181.1Sjruoho}
2191.1Sjruoho
2201.1SjruohoATF_TC_BODY(acosf_range, tc)
2211.1Sjruoho{
2221.1Sjruoho#ifndef __vax__
2231.1Sjruoho	const float x[] = { -1.1, -1.0000001, 1.1, 1.0000001 };
2241.1Sjruoho	size_t i;
2251.1Sjruoho
2261.1Sjruoho	for (i = 0; i < __arraycount(x); i++) {
2271.1Sjruoho
2281.1Sjruoho		if (isnan(acosf(x[i])) == 0)
2291.1Sjruoho			atf_tc_fail_nonfatal("acosf(%f) != NaN", x[i]);
2301.1Sjruoho	}
2311.1Sjruoho#endif
2321.1Sjruoho}
2331.1Sjruoho
2341.1SjruohoATF_TC(acosf_cosf);
2351.1SjruohoATF_TC_HEAD(acosf_cosf, tc)
2361.1Sjruoho{
2371.1Sjruoho	atf_tc_set_md_var(tc, "descr", "Test acosf(cosf(x)) == x");
2381.1Sjruoho}
2391.1Sjruoho
2401.1SjruohoATF_TC_BODY(acosf_cosf, tc)
2411.1Sjruoho{
2421.1Sjruoho#ifndef __vax__
2431.1Sjruoho	const float x[] = { 0.0, 1.0, M_PI / 2, M_PI / 3, M_PI / 6 };
2441.2Sjruoho	const float eps = 1.0e-5;
2451.1Sjruoho	float y;
2461.1Sjruoho	size_t i;
2471.1Sjruoho
2481.1Sjruoho	for (i = 0; i < __arraycount(x); i++) {
2491.1Sjruoho
2501.1Sjruoho		y = acosf(cosf(x[i]));
2511.1Sjruoho
2521.1Sjruoho		if (fabsf(y - x[i]) > eps)
2531.1Sjruoho			atf_tc_fail_nonfatal("acosf(cosf(%0.03f)) != %0.03f",
2541.1Sjruoho			    x[i], x[i]);
2551.1Sjruoho	}
2561.1Sjruoho#endif
2571.1Sjruoho}
2581.1Sjruoho
2591.1SjruohoATF_TP_ADD_TCS(tp)
2601.1Sjruoho{
2611.1Sjruoho
2621.1Sjruoho	ATF_TP_ADD_TC(tp, acos_nan);
2631.1Sjruoho	ATF_TP_ADD_TC(tp, acos_inf_neg);
2641.1Sjruoho	ATF_TP_ADD_TC(tp, acos_inf_pos);
2651.1Sjruoho	ATF_TP_ADD_TC(tp, acos_one_pos);
2661.1Sjruoho	ATF_TP_ADD_TC(tp, acos_range);
2671.1Sjruoho	ATF_TP_ADD_TC(tp, acos_cos);
2681.1Sjruoho
2691.1Sjruoho	ATF_TP_ADD_TC(tp, acosf_nan);
2701.1Sjruoho	ATF_TP_ADD_TC(tp, acosf_inf_neg);
2711.1Sjruoho	ATF_TP_ADD_TC(tp, acosf_inf_pos);
2721.1Sjruoho	ATF_TP_ADD_TC(tp, acosf_one_pos);
2731.1Sjruoho	ATF_TP_ADD_TC(tp, acosf_range);
2741.1Sjruoho	ATF_TP_ADD_TC(tp, acosf_cosf);
2751.1Sjruoho
2761.1Sjruoho	return atf_no_error();
2771.1Sjruoho}
278