1/* $NetBSD: t_cosh.c,v 1.7 2018/11/07 03:59:36 riastradh 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#include <sys/cdefs.h> 32__RCSID("$NetBSD: t_cosh.c,v 1.7 2018/11/07 03:59:36 riastradh Exp $"); 33 34#include <atf-c.h> 35#include <float.h> 36#include <math.h> 37#include <stdio.h> 38 39static const struct { 40 double x; 41 double y; 42} values[] = { 43 { -10, 11013.232920103323, }, 44 { -2, 3.762195691083631, }, 45 { -1, 1.543080634815244, }, 46 { -0.05, 1.001250260438369, }, 47 { -0.001, 1.0000005000000418, }, 48 { 0, 1, }, 49 { 0.001, 1.0000005000000418, }, 50 { 0.05, 1.001250260438369, }, 51 { 1, 1.543080634815244, }, 52 { 2, 3.762195691083631, }, 53 { 10, 11013.232920103323, }, 54}; 55 56/* 57 * cosh(3) 58 */ 59ATF_TC(cosh_inrange); 60ATF_TC_HEAD(cosh_inrange, tc) 61{ 62 atf_tc_set_md_var(tc, "descr", "cosh(x) for some values"); 63} 64 65ATF_TC_BODY(cosh_inrange, tc) 66{ 67 const double eps = DBL_EPSILON; 68 size_t i; 69 70 for (i = 0; i < __arraycount(values); i++) { 71 double x = values[i].x; 72 double cosh_x = values[i].y; 73 74 if (!(fabs((cosh(x) - cosh_x)/cosh_x) <= eps)) { 75 atf_tc_fail_nonfatal("cosh(%.17g) = %.17g != %.17g\n", 76 x, cosh(x), cosh_x); 77 } 78 } 79} 80 81ATF_TC(cosh_nan); 82ATF_TC_HEAD(cosh_nan, tc) 83{ 84 atf_tc_set_md_var(tc, "descr", "Test cosh(NaN) == NaN"); 85} 86 87ATF_TC_BODY(cosh_nan, tc) 88{ 89 const double x = 0.0L / 0.0L; 90 91 ATF_CHECK(isnan(x) != 0); 92 ATF_CHECK(isnan(cosh(x)) != 0); 93} 94 95ATF_TC(cosh_inf_neg); 96ATF_TC_HEAD(cosh_inf_neg, tc) 97{ 98 atf_tc_set_md_var(tc, "descr", "Test cosh(-Inf) == +Inf"); 99} 100 101ATF_TC_BODY(cosh_inf_neg, tc) 102{ 103 const double x = -1.0L / 0.0L; 104 double y = cosh(x); 105 106 ATF_CHECK(isinf(y) != 0); 107 ATF_CHECK(signbit(y) == 0); 108} 109 110ATF_TC(cosh_inf_pos); 111ATF_TC_HEAD(cosh_inf_pos, tc) 112{ 113 atf_tc_set_md_var(tc, "descr", "Test cosh(+Inf) == +Inf"); 114} 115 116ATF_TC_BODY(cosh_inf_pos, tc) 117{ 118 const double x = 1.0L / 0.0L; 119 double y = cosh(x); 120 121 ATF_CHECK(isinf(y) != 0); 122 ATF_CHECK(signbit(y) == 0); 123} 124 125ATF_TC(cosh_zero_neg); 126ATF_TC_HEAD(cosh_zero_neg, tc) 127{ 128 atf_tc_set_md_var(tc, "descr", "Test cosh(-0.0) == 1.0"); 129} 130 131ATF_TC_BODY(cosh_zero_neg, tc) 132{ 133 const double x = -0.0L; 134 135 if (cosh(x) != 1.0) 136 atf_tc_fail_nonfatal("cosh(-0.0) != 1.0"); 137} 138 139ATF_TC(cosh_zero_pos); 140ATF_TC_HEAD(cosh_zero_pos, tc) 141{ 142 atf_tc_set_md_var(tc, "descr", "Test cosh(+0.0) == 1.0"); 143} 144 145ATF_TC_BODY(cosh_zero_pos, tc) 146{ 147 const double x = 0.0L; 148 149 if (cosh(x) != 1.0) 150 atf_tc_fail_nonfatal("cosh(+0.0) != 1.0"); 151} 152 153/* 154 * coshf(3) 155 */ 156ATF_TC(coshf_inrange); 157ATF_TC_HEAD(coshf_inrange, tc) 158{ 159 atf_tc_set_md_var(tc, "descr", "coshf(x) for some values"); 160} 161 162ATF_TC_BODY(coshf_inrange, tc) 163{ 164 const float eps = FLT_EPSILON; 165 size_t i; 166 167 for (i = 0; i < __arraycount(values); i++) { 168 float x = values[i].x; 169 float cosh_x = values[i].y; 170 171 if (!(fabsf((coshf(x) - cosh_x)/cosh_x) <= eps)) { 172 atf_tc_fail_nonfatal("coshf(%.17g) = %.17g != %.17g\n", 173 x, coshf(x), cosh_x); 174 } 175 } 176} 177 178ATF_TC(coshf_nan); 179ATF_TC_HEAD(coshf_nan, tc) 180{ 181 atf_tc_set_md_var(tc, "descr", "Test coshf(NaN) == NaN"); 182} 183 184ATF_TC_BODY(coshf_nan, tc) 185{ 186 const float x = 0.0L / 0.0L; 187 188 ATF_CHECK(isnan(x) != 0); 189 ATF_CHECK(isnan(coshf(x)) != 0); 190} 191 192ATF_TC(coshf_inf_neg); 193ATF_TC_HEAD(coshf_inf_neg, tc) 194{ 195 atf_tc_set_md_var(tc, "descr", "Test coshf(-Inf) == +Inf"); 196} 197 198ATF_TC_BODY(coshf_inf_neg, tc) 199{ 200 const float x = -1.0L / 0.0L; 201 float y = coshf(x); 202 203 ATF_CHECK(isinf(y) != 0); 204 ATF_CHECK(signbit(y) == 0); 205} 206 207ATF_TC(coshf_inf_pos); 208ATF_TC_HEAD(coshf_inf_pos, tc) 209{ 210 atf_tc_set_md_var(tc, "descr", "Test coshf(+Inf) == +Inf"); 211} 212 213ATF_TC_BODY(coshf_inf_pos, tc) 214{ 215 const float x = 1.0L / 0.0L; 216 float y = coshf(x); 217 218 ATF_CHECK(isinf(y) != 0); 219 ATF_CHECK(signbit(y) == 0); 220} 221 222ATF_TC(coshf_zero_neg); 223ATF_TC_HEAD(coshf_zero_neg, tc) 224{ 225 atf_tc_set_md_var(tc, "descr", "Test coshf(-0.0) == 1.0"); 226} 227 228ATF_TC_BODY(coshf_zero_neg, tc) 229{ 230 const float x = -0.0L; 231 232 if (coshf(x) != 1.0) 233 atf_tc_fail_nonfatal("coshf(-0.0) != 1.0"); 234} 235 236ATF_TC(coshf_zero_pos); 237ATF_TC_HEAD(coshf_zero_pos, tc) 238{ 239 atf_tc_set_md_var(tc, "descr", "Test coshf(+0.0) == 1.0"); 240} 241 242ATF_TC_BODY(coshf_zero_pos, tc) 243{ 244 const float x = 0.0L; 245 246 if (coshf(x) != 1.0) 247 atf_tc_fail_nonfatal("coshf(+0.0) != 1.0"); 248} 249 250ATF_TP_ADD_TCS(tp) 251{ 252 253 ATF_TP_ADD_TC(tp, cosh_inrange); 254 ATF_TP_ADD_TC(tp, cosh_nan); 255 ATF_TP_ADD_TC(tp, cosh_inf_neg); 256 ATF_TP_ADD_TC(tp, cosh_inf_pos); 257 ATF_TP_ADD_TC(tp, cosh_zero_neg); 258 ATF_TP_ADD_TC(tp, cosh_zero_pos); 259 260 ATF_TP_ADD_TC(tp, coshf_inrange); 261 ATF_TP_ADD_TC(tp, coshf_nan); 262 ATF_TP_ADD_TC(tp, coshf_inf_neg); 263 ATF_TP_ADD_TC(tp, coshf_inf_pos); 264 ATF_TP_ADD_TC(tp, coshf_zero_neg); 265 ATF_TP_ADD_TC(tp, coshf_zero_pos); 266 267 return atf_no_error(); 268} 269