s_csin.c 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. /* $OpenBSD: s_csin.c,v 1.6 2013/07/03 04:46:36 espie Exp $ */
  2. /*
  3. * Copyright (c) 2008 Stephen L. Moshier <steve@moshier.net>
  4. *
  5. * Permission to use, copy, modify, and distribute this software for any
  6. * purpose with or without fee is hereby granted, provided that the above
  7. * copyright notice and this permission notice appear in all copies.
  8. *
  9. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  10. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  11. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  12. * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  13. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  14. * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  15. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  16. */
  17. /* csin()
  18. *
  19. * Complex circular sine
  20. *
  21. *
  22. *
  23. * SYNOPSIS:
  24. *
  25. * double complex csin();
  26. * double complex z, w;
  27. *
  28. * w = csin (z);
  29. *
  30. *
  31. *
  32. * DESCRIPTION:
  33. *
  34. * If
  35. * z = x + iy,
  36. *
  37. * then
  38. *
  39. * w = sin x cosh y + i cos x sinh y.
  40. *
  41. * csin(z) = -i csinh(iz).
  42. *
  43. * ACCURACY:
  44. *
  45. * Relative error:
  46. * arithmetic domain # trials peak rms
  47. * DEC -10,+10 8400 5.3e-17 1.3e-17
  48. * IEEE -10,+10 30000 3.8e-16 1.0e-16
  49. * Also tested by csin(casin(z)) = z.
  50. *
  51. */
  52. #include <float.h>
  53. #include <openlibm_complex.h>
  54. #include <openlibm_math.h>
  55. /* calculate cosh and sinh */
  56. static void
  57. cchsh(double x, double *c, double *s)
  58. {
  59. double e, ei;
  60. if (fabs(x) <= 0.5) {
  61. *c = cosh(x);
  62. *s = sinh(x);
  63. }
  64. else {
  65. e = exp(x);
  66. ei = 0.5/e;
  67. e = 0.5 * e;
  68. *s = e - ei;
  69. *c = e + ei;
  70. }
  71. }
  72. double complex
  73. csin(double complex z)
  74. {
  75. double complex w;
  76. double ch, sh;
  77. cchsh( cimag (z), &ch, &sh );
  78. w = sin (creal(z)) * ch + (cos (creal(z)) * sh) * I;
  79. return (w);
  80. }
  81. #if LDBL_MANT_DIG == DBL_MANT_DIG
  82. __strong_alias(csinl, csin);
  83. #endif /* LDBL_MANT_DIG == DBL_MANT_DIG */