1*cdebaff8SEnji Cooper /* $NetBSD: t_casinh.c,v 1.2 2016/09/20 17:19:28 christos Exp $ */ 2*cdebaff8SEnji Cooper 3*cdebaff8SEnji Cooper /* 4*cdebaff8SEnji Cooper * Written by Maya Rashish 5*cdebaff8SEnji Cooper * Public domain. 6*cdebaff8SEnji Cooper * 7*cdebaff8SEnji Cooper * Testing special values of casinh 8*cdebaff8SEnji Cooper * Values from ISO/IEC 9899:201x G.6.2.2 9*cdebaff8SEnji Cooper */ 10*cdebaff8SEnji Cooper 11*cdebaff8SEnji Cooper #include <atf-c.h> 12*cdebaff8SEnji Cooper #include <complex.h> 13*cdebaff8SEnji Cooper #include <math.h> 14*cdebaff8SEnji Cooper 15*cdebaff8SEnji Cooper #define RE(z) (((double *)(&z))[0]) 16*cdebaff8SEnji Cooper #define IM(z) (((double *)(&z))[1]) 17*cdebaff8SEnji Cooper 18*cdebaff8SEnji Cooper static const struct { 19*cdebaff8SEnji Cooper double input_re; 20*cdebaff8SEnji Cooper double input_im; 21*cdebaff8SEnji Cooper double result_re; 22*cdebaff8SEnji Cooper double result_im; 23*cdebaff8SEnji Cooper } values[] = { 24*cdebaff8SEnji Cooper { +0, +0, +0, +0}, 25*cdebaff8SEnji Cooper { +5.032E3, +INFINITY, +INFINITY, +M_PI/2}, 26*cdebaff8SEnji Cooper { +INFINITY, +5.023E3, +INFINITY, +0}, 27*cdebaff8SEnji Cooper { +INFINITY, +INFINITY, +INFINITY, +M_PI/4}, 28*cdebaff8SEnji Cooper #ifdef __HAVE_NANF 29*cdebaff8SEnji Cooper { +INFINITY, +NAN, +INFINITY, +NAN}, 30*cdebaff8SEnji Cooper { +5.032E3, +NAN, +NAN, +NAN}, /* + FE_INVALID optionally raised */ 31*cdebaff8SEnji Cooper { +NAN, +0, +NAN, +0}, 32*cdebaff8SEnji Cooper { +NAN, -5.023E3, +NAN, +NAN}, /* + FE_INVALID optionally raised */ 33*cdebaff8SEnji Cooper { +NAN, +INFINITY, +INFINITY, +NAN}, /* sign of real part of result unspecified */ 34*cdebaff8SEnji Cooper { +NAN, +NAN, +NAN, +NAN}, 35*cdebaff8SEnji Cooper #endif 36*cdebaff8SEnji Cooper }; 37*cdebaff8SEnji Cooper 38*cdebaff8SEnji Cooper #ifdef __HAVE_NANF 39*cdebaff8SEnji Cooper #define both_nan(a,b) (isnan(a) && isnan(b)) 40*cdebaff8SEnji Cooper #else 41*cdebaff8SEnji Cooper #define both_nan(a,b) 0 42*cdebaff8SEnji Cooper #endif 43*cdebaff8SEnji Cooper 44*cdebaff8SEnji Cooper #define crude_equality(a,b) ((a == b) || both_nan(a,b)) 45*cdebaff8SEnji Cooper 46*cdebaff8SEnji Cooper #define ATF_COMPLEX_EQUAL(a,b) do { \ 47*cdebaff8SEnji Cooper complex double ci = casinh(a); \ 48*cdebaff8SEnji Cooper ATF_CHECK_MSG(crude_equality(creal(ci),creal(b)) && \ 49*cdebaff8SEnji Cooper crude_equality(cimag(ci), cimag(b)), \ 50*cdebaff8SEnji Cooper "for casinh([%g,%g]) = [%g,%g] != [%g,%g]", \ 51*cdebaff8SEnji Cooper creal(a), cimag(a), creal(ci), cimag(ci), creal(b), cimag(b)); \ 52*cdebaff8SEnji Cooper } while (0/*CONSTCOND*/) 53*cdebaff8SEnji Cooper 54*cdebaff8SEnji Cooper 55*cdebaff8SEnji Cooper ATF_TC(casinh); 56*cdebaff8SEnji Cooper ATF_TC_HEAD(casinh, tc) 57*cdebaff8SEnji Cooper { 58*cdebaff8SEnji Cooper atf_tc_set_md_var(tc, "descr","Check casinh family - special values"); 59*cdebaff8SEnji Cooper } 60*cdebaff8SEnji Cooper 61*cdebaff8SEnji Cooper ATF_TC_BODY(casinh, tc) 62*cdebaff8SEnji Cooper { 63*cdebaff8SEnji Cooper complex double input; 64*cdebaff8SEnji Cooper complex double result; 65*cdebaff8SEnji Cooper unsigned int i; 66*cdebaff8SEnji Cooper for (i = 0; i < __arraycount(values); i++) { 67*cdebaff8SEnji Cooper RE(input) = values[i].input_re; 68*cdebaff8SEnji Cooper IM(input) = values[i].input_im; 69*cdebaff8SEnji Cooper RE(result) = values[i].result_re; 70*cdebaff8SEnji Cooper IM(result) = values[i].result_im; 71*cdebaff8SEnji Cooper ATF_COMPLEX_EQUAL(input, result); 72*cdebaff8SEnji Cooper } 73*cdebaff8SEnji Cooper } 74*cdebaff8SEnji Cooper 75*cdebaff8SEnji Cooper ATF_TP_ADD_TCS(tp) 76*cdebaff8SEnji Cooper { 77*cdebaff8SEnji Cooper 78*cdebaff8SEnji Cooper ATF_TP_ADD_TC(tp, casinh); 79*cdebaff8SEnji Cooper 80*cdebaff8SEnji Cooper return atf_no_error(); 81*cdebaff8SEnji Cooper } 82