s_ccosl.c 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. /* $OpenBSD: s_ccosl.c,v 1.2 2011/07/20 19:28:33 martynas 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. /* ccosl()
  18. *
  19. * Complex circular cosine
  20. *
  21. *
  22. *
  23. * SYNOPSIS:
  24. *
  25. * long double complex ccosl();
  26. * long double complex z, w;
  27. *
  28. * w = ccosl( z );
  29. *
  30. *
  31. *
  32. * DESCRIPTION:
  33. *
  34. * If
  35. * z = x + iy,
  36. *
  37. * then
  38. *
  39. * w = cos x cosh y - i sin x sinh y.
  40. *
  41. *
  42. *
  43. * ACCURACY:
  44. *
  45. * Relative error:
  46. * arithmetic domain # trials peak rms
  47. * DEC -10,+10 8400 4.5e-17 1.3e-17
  48. * IEEE -10,+10 30000 3.8e-16 1.0e-16
  49. */
  50. #include <complex.h>
  51. #include <math.h>
  52. static void
  53. cchshl(long double x, long double *c, long double *s)
  54. {
  55. long double e, ei;
  56. if(fabsl(x) <= 0.5L) {
  57. *c = coshl(x);
  58. *s = sinhl(x);
  59. } else {
  60. e = expl(x);
  61. ei = 0.5L/e;
  62. e = 0.5L * e;
  63. *s = e - ei;
  64. *c = e + ei;
  65. }
  66. }
  67. long double complex
  68. ccosl(long double complex z)
  69. {
  70. long double complex w;
  71. long double ch, sh;
  72. cchshl(cimagl(z), &ch, &sh);
  73. w = cosl(creall(z)) * ch + (-sinl(creall(z)) * sh) * I;
  74. return (w);
  75. }