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