t_acos.c revision 1.4
11.4Sisaki/* $NetBSD: t_acos.c,v 1.4 2013/04/09 12:11:04 isaki 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.4Sisakistatic const struct {
361.4Sisaki	double x;
371.4Sisaki	double y;
381.4Sisaki} values[] = {
391.4Sisaki	{ -1,    M_PI,              },
401.4Sisaki	{ -0.99, 3.000053180265366, },
411.4Sisaki	{ -0.5,  2.094395102393195, },
421.4Sisaki	{ -0.1,  1.670963747956456, },
431.4Sisaki	{  0,    M_PI / 2,          },
441.4Sisaki	{  0.1,  1.470628905633337, },
451.4Sisaki	{  0.5,  1.047197551196598, },
461.4Sisaki	{  0.99, 0.141539473324427, },
471.4Sisaki};
481.4Sisaki
491.1Sjruoho/*
501.1Sjruoho * acos(3)
511.1Sjruoho */
521.1SjruohoATF_TC(acos_nan);
531.1SjruohoATF_TC_HEAD(acos_nan, tc)
541.1Sjruoho{
551.1Sjruoho	atf_tc_set_md_var(tc, "descr", "Test acos(NaN) == NaN");
561.1Sjruoho}
571.1Sjruoho
581.1SjruohoATF_TC_BODY(acos_nan, tc)
591.1Sjruoho{
601.1Sjruoho#ifndef __vax__
611.1Sjruoho	const double x = 0.0L / 0.0L;
621.1Sjruoho
631.1Sjruoho	if (isnan(acos(x)) == 0)
641.1Sjruoho		atf_tc_fail_nonfatal("acos(NaN) != NaN");
651.1Sjruoho#endif
661.1Sjruoho}
671.1Sjruoho
681.1SjruohoATF_TC(acos_inf_neg);
691.1SjruohoATF_TC_HEAD(acos_inf_neg, tc)
701.1Sjruoho{
711.1Sjruoho	atf_tc_set_md_var(tc, "descr", "Test acos(-Inf) == NaN");
721.1Sjruoho}
731.1Sjruoho
741.1SjruohoATF_TC_BODY(acos_inf_neg, tc)
751.1Sjruoho{
761.1Sjruoho#ifndef __vax__
771.1Sjruoho	const double x = -1.0L / 0.0L;
781.1Sjruoho
791.1Sjruoho	if (isnan(acos(x)) == 0)
801.1Sjruoho		atf_tc_fail_nonfatal("acos(-Inf) != NaN");
811.1Sjruoho#endif
821.1Sjruoho}
831.1Sjruoho
841.1SjruohoATF_TC(acos_inf_pos);
851.1SjruohoATF_TC_HEAD(acos_inf_pos, tc)
861.1Sjruoho{
871.1Sjruoho	atf_tc_set_md_var(tc, "descr", "Test acos(+Inf) == NaN");
881.1Sjruoho}
891.1Sjruoho
901.1SjruohoATF_TC_BODY(acos_inf_pos, tc)
911.1Sjruoho{
921.1Sjruoho#ifndef __vax__
931.1Sjruoho	const double x = 1.0L / 0.0L;
941.1Sjruoho
951.1Sjruoho	if (isnan(acos(x)) == 0)
961.1Sjruoho		atf_tc_fail_nonfatal("acos(+Inf) != NaN");
971.1Sjruoho#endif
981.1Sjruoho}
991.1Sjruoho
1001.1SjruohoATF_TC(acos_one_pos);
1011.1SjruohoATF_TC_HEAD(acos_one_pos, tc)
1021.1Sjruoho{
1031.1Sjruoho	atf_tc_set_md_var(tc, "descr", "Test acos(1.0) == +0.0");
1041.1Sjruoho}
1051.1Sjruoho
1061.1SjruohoATF_TC_BODY(acos_one_pos, tc)
1071.1Sjruoho{
1081.1Sjruoho#ifndef __vax__
1091.1Sjruoho	const double y = acos(1.0);
1101.1Sjruoho
1111.1Sjruoho	if (fabs(y) > 0.0 || signbit(y) != 0)
1121.1Sjruoho		atf_tc_fail_nonfatal("acos(1.0) != +0.0");
1131.1Sjruoho#endif
1141.1Sjruoho}
1151.1Sjruoho
1161.1SjruohoATF_TC(acos_range);
1171.1SjruohoATF_TC_HEAD(acos_range, tc)
1181.1Sjruoho{
1191.1Sjruoho	atf_tc_set_md_var(tc, "descr", "Test acos(x) == NaN, x < -1, x > 1");
1201.1Sjruoho}
1211.1Sjruoho
1221.1SjruohoATF_TC_BODY(acos_range, tc)
1231.1Sjruoho{
1241.1Sjruoho#ifndef __vax__
1251.1Sjruoho	const double x[] = { -1.1, -1.000000001, 1.1, 1.000000001 };
1261.1Sjruoho	size_t i;
1271.1Sjruoho
1281.1Sjruoho	for (i = 0; i < __arraycount(x); i++) {
1291.1Sjruoho
1301.1Sjruoho		if (isnan(acos(x[i])) == 0)
1311.1Sjruoho			atf_tc_fail_nonfatal("acos(%f) != NaN", x[i]);
1321.1Sjruoho	}
1331.1Sjruoho#endif
1341.1Sjruoho}
1351.1Sjruoho
1361.4SisakiATF_TC(acos_inrange);
1371.4SisakiATF_TC_HEAD(acos_inrange, tc)
1381.1Sjruoho{
1391.4Sisaki	atf_tc_set_md_var(tc, "descr", "Test acos(x) for some values");
1401.1Sjruoho}
1411.1Sjruoho
1421.4SisakiATF_TC_BODY(acos_inrange, tc)
1431.1Sjruoho{
1441.1Sjruoho#ifndef __vax__
1451.1Sjruoho	const double eps = 1.0e-15;
1461.4Sisaki	double x;
1471.1Sjruoho	double y;
1481.1Sjruoho	size_t i;
1491.1Sjruoho
1501.4Sisaki	for (i = 0; i < __arraycount(values); i++) {
1511.4Sisaki		x = values[i].x;
1521.4Sisaki		y = values[i].y;
1531.4Sisaki		if (fabs(acos(x) - y) > eps)
1541.4Sisaki			atf_tc_fail_nonfatal("acos(%g) != %g", x, y);
1551.1Sjruoho	}
1561.1Sjruoho#endif
1571.1Sjruoho}
1581.1Sjruoho
1591.1Sjruoho/*
1601.1Sjruoho * acosf(3)
1611.1Sjruoho */
1621.1SjruohoATF_TC(acosf_nan);
1631.1SjruohoATF_TC_HEAD(acosf_nan, tc)
1641.1Sjruoho{
1651.1Sjruoho	atf_tc_set_md_var(tc, "descr", "Test acosf(NaN) == NaN");
1661.1Sjruoho}
1671.1Sjruoho
1681.1SjruohoATF_TC_BODY(acosf_nan, tc)
1691.1Sjruoho{
1701.1Sjruoho#ifndef __vax__
1711.1Sjruoho	const float x = 0.0L / 0.0L;
1721.1Sjruoho
1731.1Sjruoho	if (isnan(acosf(x)) == 0)
1741.1Sjruoho		atf_tc_fail_nonfatal("acosf(NaN) != NaN");
1751.1Sjruoho#endif
1761.1Sjruoho}
1771.1Sjruoho
1781.1SjruohoATF_TC(acosf_inf_neg);
1791.1SjruohoATF_TC_HEAD(acosf_inf_neg, tc)
1801.1Sjruoho{
1811.1Sjruoho	atf_tc_set_md_var(tc, "descr", "Test acosf(-Inf) == NaN");
1821.1Sjruoho}
1831.1Sjruoho
1841.1SjruohoATF_TC_BODY(acosf_inf_neg, tc)
1851.1Sjruoho{
1861.1Sjruoho#ifndef __vax__
1871.1Sjruoho	const float x = -1.0L / 0.0L;
1881.1Sjruoho
1891.1Sjruoho	if (isnan(acosf(x)) == 0)
1901.1Sjruoho		atf_tc_fail_nonfatal("acosf(-Inf) != NaN");
1911.1Sjruoho#endif
1921.1Sjruoho}
1931.1Sjruoho
1941.1SjruohoATF_TC(acosf_inf_pos);
1951.1SjruohoATF_TC_HEAD(acosf_inf_pos, tc)
1961.1Sjruoho{
1971.1Sjruoho	atf_tc_set_md_var(tc, "descr", "Test acosf(+Inf) == NaN");
1981.1Sjruoho}
1991.1Sjruoho
2001.1SjruohoATF_TC_BODY(acosf_inf_pos, tc)
2011.1Sjruoho{
2021.1Sjruoho#ifndef __vax__
2031.1Sjruoho	const float x = 1.0L / 0.0L;
2041.1Sjruoho
2051.1Sjruoho	if (isnan(acosf(x)) == 0)
2061.1Sjruoho		atf_tc_fail_nonfatal("acosf(+Inf) != NaN");
2071.1Sjruoho#endif
2081.1Sjruoho}
2091.1Sjruoho
2101.1SjruohoATF_TC(acosf_one_pos);
2111.1SjruohoATF_TC_HEAD(acosf_one_pos, tc)
2121.1Sjruoho{
2131.1Sjruoho	atf_tc_set_md_var(tc, "descr", "Test acosf(1.0) == +0.0");
2141.1Sjruoho}
2151.1Sjruoho
2161.1SjruohoATF_TC_BODY(acosf_one_pos, tc)
2171.1Sjruoho{
2181.1Sjruoho#ifndef __vax__
2191.1Sjruoho	const float y = acosf(1.0);
2201.1Sjruoho
2211.1Sjruoho	if (fabsf(y) > 0.0 || signbit(y) != 0)
2221.1Sjruoho		atf_tc_fail_nonfatal("acosf(1.0) != +0.0");
2231.1Sjruoho#endif
2241.1Sjruoho}
2251.1Sjruoho
2261.1SjruohoATF_TC(acosf_range);
2271.1SjruohoATF_TC_HEAD(acosf_range, tc)
2281.1Sjruoho{
2291.1Sjruoho	atf_tc_set_md_var(tc, "descr", "Test acosf(x) == NaN, x < -1, x > 1");
2301.1Sjruoho}
2311.1Sjruoho
2321.1SjruohoATF_TC_BODY(acosf_range, tc)
2331.1Sjruoho{
2341.1Sjruoho#ifndef __vax__
2351.1Sjruoho	const float x[] = { -1.1, -1.0000001, 1.1, 1.0000001 };
2361.1Sjruoho	size_t i;
2371.1Sjruoho
2381.1Sjruoho	for (i = 0; i < __arraycount(x); i++) {
2391.1Sjruoho
2401.1Sjruoho		if (isnan(acosf(x[i])) == 0)
2411.1Sjruoho			atf_tc_fail_nonfatal("acosf(%f) != NaN", x[i]);
2421.1Sjruoho	}
2431.1Sjruoho#endif
2441.1Sjruoho}
2451.1Sjruoho
2461.4SisakiATF_TC(acosf_inrange);
2471.4SisakiATF_TC_HEAD(acosf_inrange, tc)
2481.1Sjruoho{
2491.4Sisaki	atf_tc_set_md_var(tc, "descr", "Test acosf(x) for some values");
2501.1Sjruoho}
2511.1Sjruoho
2521.4SisakiATF_TC_BODY(acosf_inrange, tc)
2531.1Sjruoho{
2541.1Sjruoho#ifndef __vax__
2551.2Sjruoho	const float eps = 1.0e-5;
2561.4Sisaki	float x;
2571.1Sjruoho	float y;
2581.1Sjruoho	size_t i;
2591.1Sjruoho
2601.4Sisaki	for (i = 0; i < __arraycount(values); i++) {
2611.4Sisaki		x = values[i].x;
2621.4Sisaki		y = values[i].y;
2631.4Sisaki		if (fabsf(acosf(x) - y) > eps)
2641.4Sisaki			atf_tc_fail_nonfatal("acosf(%g) != %g", x, y);
2651.1Sjruoho	}
2661.1Sjruoho#endif
2671.1Sjruoho}
2681.1Sjruoho
2691.1SjruohoATF_TP_ADD_TCS(tp)
2701.1Sjruoho{
2711.1Sjruoho
2721.1Sjruoho	ATF_TP_ADD_TC(tp, acos_nan);
2731.1Sjruoho	ATF_TP_ADD_TC(tp, acos_inf_neg);
2741.1Sjruoho	ATF_TP_ADD_TC(tp, acos_inf_pos);
2751.1Sjruoho	ATF_TP_ADD_TC(tp, acos_one_pos);
2761.1Sjruoho	ATF_TP_ADD_TC(tp, acos_range);
2771.4Sisaki	ATF_TP_ADD_TC(tp, acos_inrange);
2781.1Sjruoho
2791.1Sjruoho	ATF_TP_ADD_TC(tp, acosf_nan);
2801.1Sjruoho	ATF_TP_ADD_TC(tp, acosf_inf_neg);
2811.1Sjruoho	ATF_TP_ADD_TC(tp, acosf_inf_pos);
2821.1Sjruoho	ATF_TP_ADD_TC(tp, acosf_one_pos);
2831.1Sjruoho	ATF_TP_ADD_TC(tp, acosf_range);
2841.4Sisaki	ATF_TP_ADD_TC(tp, acosf_inrange);
2851.1Sjruoho
2861.1Sjruoho	return atf_no_error();
2871.1Sjruoho}
288