t_acos.c revision 1.3
1/* $NetBSD: t_acos.c,v 1.3 2012/03/23 23:45:31 matt Exp $ */ 2 3/*- 4 * Copyright (c) 2011 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Jukka Ruohonen. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32#include <atf-c.h> 33#include <math.h> 34 35/* 36 * acos(3) 37 */ 38ATF_TC(acos_nan); 39ATF_TC_HEAD(acos_nan, tc) 40{ 41 atf_tc_set_md_var(tc, "descr", "Test acos(NaN) == NaN"); 42} 43 44ATF_TC_BODY(acos_nan, tc) 45{ 46#ifndef __vax__ 47 const double x = 0.0L / 0.0L; 48 49 if (isnan(acos(x)) == 0) 50 atf_tc_fail_nonfatal("acos(NaN) != NaN"); 51#endif 52} 53 54ATF_TC(acos_inf_neg); 55ATF_TC_HEAD(acos_inf_neg, tc) 56{ 57 atf_tc_set_md_var(tc, "descr", "Test acos(-Inf) == NaN"); 58} 59 60ATF_TC_BODY(acos_inf_neg, tc) 61{ 62#ifndef __vax__ 63 const double x = -1.0L / 0.0L; 64 65 if (isnan(acos(x)) == 0) 66 atf_tc_fail_nonfatal("acos(-Inf) != NaN"); 67#endif 68} 69 70ATF_TC(acos_inf_pos); 71ATF_TC_HEAD(acos_inf_pos, tc) 72{ 73 atf_tc_set_md_var(tc, "descr", "Test acos(+Inf) == NaN"); 74} 75 76ATF_TC_BODY(acos_inf_pos, tc) 77{ 78#ifndef __vax__ 79 const double x = 1.0L / 0.0L; 80 81 if (isnan(acos(x)) == 0) 82 atf_tc_fail_nonfatal("acos(+Inf) != NaN"); 83#endif 84} 85 86ATF_TC(acos_one_pos); 87ATF_TC_HEAD(acos_one_pos, tc) 88{ 89 atf_tc_set_md_var(tc, "descr", "Test acos(1.0) == +0.0"); 90} 91 92ATF_TC_BODY(acos_one_pos, tc) 93{ 94#ifndef __vax__ 95 const double y = acos(1.0); 96 97 if (fabs(y) > 0.0 || signbit(y) != 0) 98 atf_tc_fail_nonfatal("acos(1.0) != +0.0"); 99#endif 100} 101 102ATF_TC(acos_range); 103ATF_TC_HEAD(acos_range, tc) 104{ 105 atf_tc_set_md_var(tc, "descr", "Test acos(x) == NaN, x < -1, x > 1"); 106} 107 108ATF_TC_BODY(acos_range, tc) 109{ 110#ifndef __vax__ 111 const double x[] = { -1.1, -1.000000001, 1.1, 1.000000001 }; 112 size_t i; 113 114 for (i = 0; i < __arraycount(x); i++) { 115 116 if (isnan(acos(x[i])) == 0) 117 atf_tc_fail_nonfatal("acos(%f) != NaN", x[i]); 118 } 119#endif 120} 121 122ATF_TC(acos_cos); 123ATF_TC_HEAD(acos_cos, tc) 124{ 125 atf_tc_set_md_var(tc, "descr", "Test acos(cos(x)) == x"); 126} 127 128ATF_TC_BODY(acos_cos, tc) 129{ 130#ifndef __vax__ 131 const double x[] = { 0.0, 1.0, M_PI / 2, M_PI / 3, M_PI / 6 }; 132 const double eps = 1.0e-15; 133 double y; 134 size_t i; 135 136 for (i = 0; i < __arraycount(x); i++) { 137 138 y = acos(cos(x[i])); 139 140 if (fabs(y - x[i]) > eps) 141 atf_tc_fail_nonfatal( 142 "acos(cos(%0.03f)) != %0.03f (eps=%0.03e)", 143 x[i], x[i], fabs(y - x[i])); 144 } 145#endif 146} 147 148/* 149 * acosf(3) 150 */ 151ATF_TC(acosf_nan); 152ATF_TC_HEAD(acosf_nan, tc) 153{ 154 atf_tc_set_md_var(tc, "descr", "Test acosf(NaN) == NaN"); 155} 156 157ATF_TC_BODY(acosf_nan, tc) 158{ 159#ifndef __vax__ 160 const float x = 0.0L / 0.0L; 161 162 if (isnan(acosf(x)) == 0) 163 atf_tc_fail_nonfatal("acosf(NaN) != NaN"); 164#endif 165} 166 167ATF_TC(acosf_inf_neg); 168ATF_TC_HEAD(acosf_inf_neg, tc) 169{ 170 atf_tc_set_md_var(tc, "descr", "Test acosf(-Inf) == NaN"); 171} 172 173ATF_TC_BODY(acosf_inf_neg, tc) 174{ 175#ifndef __vax__ 176 const float x = -1.0L / 0.0L; 177 178 if (isnan(acosf(x)) == 0) 179 atf_tc_fail_nonfatal("acosf(-Inf) != NaN"); 180#endif 181} 182 183ATF_TC(acosf_inf_pos); 184ATF_TC_HEAD(acosf_inf_pos, tc) 185{ 186 atf_tc_set_md_var(tc, "descr", "Test acosf(+Inf) == NaN"); 187} 188 189ATF_TC_BODY(acosf_inf_pos, tc) 190{ 191#ifndef __vax__ 192 const float x = 1.0L / 0.0L; 193 194 if (isnan(acosf(x)) == 0) 195 atf_tc_fail_nonfatal("acosf(+Inf) != NaN"); 196#endif 197} 198 199ATF_TC(acosf_one_pos); 200ATF_TC_HEAD(acosf_one_pos, tc) 201{ 202 atf_tc_set_md_var(tc, "descr", "Test acosf(1.0) == +0.0"); 203} 204 205ATF_TC_BODY(acosf_one_pos, tc) 206{ 207#ifndef __vax__ 208 const float y = acosf(1.0); 209 210 if (fabsf(y) > 0.0 || signbit(y) != 0) 211 atf_tc_fail_nonfatal("acosf(1.0) != +0.0"); 212#endif 213} 214 215ATF_TC(acosf_range); 216ATF_TC_HEAD(acosf_range, tc) 217{ 218 atf_tc_set_md_var(tc, "descr", "Test acosf(x) == NaN, x < -1, x > 1"); 219} 220 221ATF_TC_BODY(acosf_range, tc) 222{ 223#ifndef __vax__ 224 const float x[] = { -1.1, -1.0000001, 1.1, 1.0000001 }; 225 size_t i; 226 227 for (i = 0; i < __arraycount(x); i++) { 228 229 if (isnan(acosf(x[i])) == 0) 230 atf_tc_fail_nonfatal("acosf(%f) != NaN", x[i]); 231 } 232#endif 233} 234 235ATF_TC(acosf_cosf); 236ATF_TC_HEAD(acosf_cosf, tc) 237{ 238 atf_tc_set_md_var(tc, "descr", "Test acosf(cosf(x)) == x"); 239} 240 241ATF_TC_BODY(acosf_cosf, tc) 242{ 243#ifndef __vax__ 244 const float x[] = { 0.0, 1.0, M_PI / 2, M_PI / 3, M_PI / 6 }; 245 const float eps = 1.0e-5; 246 float y; 247 size_t i; 248 249 for (i = 0; i < __arraycount(x); i++) { 250 251 y = acosf(cosf(x[i])); 252 253 if (fabsf(y - x[i]) > eps) 254 atf_tc_fail_nonfatal( 255 "acosf(cosf(%0.03f)) != %0.03f (eps=%0.03e)", 256 x[i], x[i], fabs(y - x[i])); 257 } 258#endif 259} 260 261ATF_TP_ADD_TCS(tp) 262{ 263 264 ATF_TP_ADD_TC(tp, acos_nan); 265 ATF_TP_ADD_TC(tp, acos_inf_neg); 266 ATF_TP_ADD_TC(tp, acos_inf_pos); 267 ATF_TP_ADD_TC(tp, acos_one_pos); 268 ATF_TP_ADD_TC(tp, acos_range); 269 ATF_TP_ADD_TC(tp, acos_cos); 270 271 ATF_TP_ADD_TC(tp, acosf_nan); 272 ATF_TP_ADD_TC(tp, acosf_inf_neg); 273 ATF_TP_ADD_TC(tp, acosf_inf_pos); 274 ATF_TP_ADD_TC(tp, acosf_one_pos); 275 ATF_TP_ADD_TC(tp, acosf_range); 276 ATF_TP_ADD_TC(tp, acosf_cosf); 277 278 return atf_no_error(); 279} 280