1 /* $NetBSD: t_acos.c,v 1.2 2011/09/18 04:48:38 jruoho 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("acos(cos(%0.03f)) != %0.03f", 142 x[i], x[i]); 143 } 144 #endif 145 } 146 147 /* 148 * acosf(3) 149 */ 150 ATF_TC(acosf_nan); 151 ATF_TC_HEAD(acosf_nan, tc) 152 { 153 atf_tc_set_md_var(tc, "descr", "Test acosf(NaN) == NaN"); 154 } 155 156 ATF_TC_BODY(acosf_nan, tc) 157 { 158 #ifndef __vax__ 159 const float x = 0.0L / 0.0L; 160 161 if (isnan(acosf(x)) == 0) 162 atf_tc_fail_nonfatal("acosf(NaN) != NaN"); 163 #endif 164 } 165 166 ATF_TC(acosf_inf_neg); 167 ATF_TC_HEAD(acosf_inf_neg, tc) 168 { 169 atf_tc_set_md_var(tc, "descr", "Test acosf(-Inf) == NaN"); 170 } 171 172 ATF_TC_BODY(acosf_inf_neg, tc) 173 { 174 #ifndef __vax__ 175 const float x = -1.0L / 0.0L; 176 177 if (isnan(acosf(x)) == 0) 178 atf_tc_fail_nonfatal("acosf(-Inf) != NaN"); 179 #endif 180 } 181 182 ATF_TC(acosf_inf_pos); 183 ATF_TC_HEAD(acosf_inf_pos, tc) 184 { 185 atf_tc_set_md_var(tc, "descr", "Test acosf(+Inf) == NaN"); 186 } 187 188 ATF_TC_BODY(acosf_inf_pos, tc) 189 { 190 #ifndef __vax__ 191 const float x = 1.0L / 0.0L; 192 193 if (isnan(acosf(x)) == 0) 194 atf_tc_fail_nonfatal("acosf(+Inf) != NaN"); 195 #endif 196 } 197 198 ATF_TC(acosf_one_pos); 199 ATF_TC_HEAD(acosf_one_pos, tc) 200 { 201 atf_tc_set_md_var(tc, "descr", "Test acosf(1.0) == +0.0"); 202 } 203 204 ATF_TC_BODY(acosf_one_pos, tc) 205 { 206 #ifndef __vax__ 207 const float y = acosf(1.0); 208 209 if (fabsf(y) > 0.0 || signbit(y) != 0) 210 atf_tc_fail_nonfatal("acosf(1.0) != +0.0"); 211 #endif 212 } 213 214 ATF_TC(acosf_range); 215 ATF_TC_HEAD(acosf_range, tc) 216 { 217 atf_tc_set_md_var(tc, "descr", "Test acosf(x) == NaN, x < -1, x > 1"); 218 } 219 220 ATF_TC_BODY(acosf_range, tc) 221 { 222 #ifndef __vax__ 223 const float x[] = { -1.1, -1.0000001, 1.1, 1.0000001 }; 224 size_t i; 225 226 for (i = 0; i < __arraycount(x); i++) { 227 228 if (isnan(acosf(x[i])) == 0) 229 atf_tc_fail_nonfatal("acosf(%f) != NaN", x[i]); 230 } 231 #endif 232 } 233 234 ATF_TC(acosf_cosf); 235 ATF_TC_HEAD(acosf_cosf, tc) 236 { 237 atf_tc_set_md_var(tc, "descr", "Test acosf(cosf(x)) == x"); 238 } 239 240 ATF_TC_BODY(acosf_cosf, tc) 241 { 242 #ifndef __vax__ 243 const float x[] = { 0.0, 1.0, M_PI / 2, M_PI / 3, M_PI / 6 }; 244 const float eps = 1.0e-5; 245 float y; 246 size_t i; 247 248 for (i = 0; i < __arraycount(x); i++) { 249 250 y = acosf(cosf(x[i])); 251 252 if (fabsf(y - x[i]) > eps) 253 atf_tc_fail_nonfatal("acosf(cosf(%0.03f)) != %0.03f", 254 x[i], x[i]); 255 } 256 #endif 257 } 258 259 ATF_TP_ADD_TCS(tp) 260 { 261 262 ATF_TP_ADD_TC(tp, acos_nan); 263 ATF_TP_ADD_TC(tp, acos_inf_neg); 264 ATF_TP_ADD_TC(tp, acos_inf_pos); 265 ATF_TP_ADD_TC(tp, acos_one_pos); 266 ATF_TP_ADD_TC(tp, acos_range); 267 ATF_TP_ADD_TC(tp, acos_cos); 268 269 ATF_TP_ADD_TC(tp, acosf_nan); 270 ATF_TP_ADD_TC(tp, acosf_inf_neg); 271 ATF_TP_ADD_TC(tp, acosf_inf_pos); 272 ATF_TP_ADD_TC(tp, acosf_one_pos); 273 ATF_TP_ADD_TC(tp, acosf_range); 274 ATF_TP_ADD_TC(tp, acosf_cosf); 275 276 return atf_no_error(); 277 } 278