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 */ 38 ATF_TC(acos_nan); 39 ATF_TC_HEAD(acos_nan, tc) 40 { 41 atf_tc_set_md_var(tc, "descr", "Test acos(NaN) == NaN"); 42 } 43 44 ATF_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 54 ATF_TC(acos_inf_neg); 55 ATF_TC_HEAD(acos_inf_neg, tc) 56 { 57 atf_tc_set_md_var(tc, "descr", "Test acos(-Inf) == NaN"); 58 } 59 60 ATF_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 70 ATF_TC(acos_inf_pos); 71 ATF_TC_HEAD(acos_inf_pos, tc) 72 { 73 atf_tc_set_md_var(tc, "descr", "Test acos(+Inf) == NaN"); 74 } 75 76 ATF_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 86 ATF_TC(acos_one_pos); 87 ATF_TC_HEAD(acos_one_pos, tc) 88 { 89 atf_tc_set_md_var(tc, "descr", "Test acos(1.0) == +0.0"); 90 } 91 92 ATF_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 102 ATF_TC(acos_range); 103 ATF_TC_HEAD(acos_range, tc) 104 { 105 atf_tc_set_md_var(tc, "descr", "Test acos(x) == NaN, x < -1, x > 1"); 106 } 107 108 ATF_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 122 ATF_TC(acos_cos); 123 ATF_TC_HEAD(acos_cos, tc) 124 { 125 atf_tc_set_md_var(tc, "descr", "Test acos(cos(x)) == x"); 126 } 127 128 ATF_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 */ 151 ATF_TC(acosf_nan); 152 ATF_TC_HEAD(acosf_nan, tc) 153 { 154 atf_tc_set_md_var(tc, "descr", "Test acosf(NaN) == NaN"); 155 } 156 157 ATF_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 167 ATF_TC(acosf_inf_neg); 168 ATF_TC_HEAD(acosf_inf_neg, tc) 169 { 170 atf_tc_set_md_var(tc, "descr", "Test acosf(-Inf) == NaN"); 171 } 172 173 ATF_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 183 ATF_TC(acosf_inf_pos); 184 ATF_TC_HEAD(acosf_inf_pos, tc) 185 { 186 atf_tc_set_md_var(tc, "descr", "Test acosf(+Inf) == NaN"); 187 } 188 189 ATF_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 199 ATF_TC(acosf_one_pos); 200 ATF_TC_HEAD(acosf_one_pos, tc) 201 { 202 atf_tc_set_md_var(tc, "descr", "Test acosf(1.0) == +0.0"); 203 } 204 205 ATF_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 215 ATF_TC(acosf_range); 216 ATF_TC_HEAD(acosf_range, tc) 217 { 218 atf_tc_set_md_var(tc, "descr", "Test acosf(x) == NaN, x < -1, x > 1"); 219 } 220 221 ATF_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 235 ATF_TC(acosf_cosf); 236 ATF_TC_HEAD(acosf_cosf, tc) 237 { 238 atf_tc_set_md_var(tc, "descr", "Test acosf(cosf(x)) == x"); 239 } 240 241 ATF_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 261 ATF_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