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