/contrib/netbsd-tests/lib/libm/t_casinh.c

https://bitbucket.org/freebsd/freebsd-base · C · 81 lines · 60 code · 13 blank · 8 comment · 6 complexity · 21b7620c32ca3b4414d8760aff90b505 MD5 · raw file

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