s_ccos.c 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. /* $OpenBSD: s_ccos.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. /* ccos()
  18. *
  19. * Complex circular cosine
  20. *
  21. *
  22. *
  23. * SYNOPSIS:
  24. *
  25. * double complex ccos();
  26. * double complex z, w;
  27. *
  28. * w = ccos (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 <float.h>
  52. #include "openlibm.h"
  53. /* calculate cosh and sinh */
  54. static void
  55. _cchsh(double x, double *c, double *s)
  56. {
  57. double e, ei;
  58. if (fabs(x) <= 0.5) {
  59. *c = cosh(x);
  60. *s = sinh(x);
  61. }
  62. else {
  63. e = exp(x);
  64. ei = 0.5/e;
  65. e = 0.5 * e;
  66. *s = e - ei;
  67. *c = e + ei;
  68. }
  69. }
  70. double complex
  71. ccos(double complex z)
  72. {
  73. double complex w;
  74. double ch, sh;
  75. _cchsh( cimag(z), &ch, &sh );
  76. w = cos(creal (z)) * ch - (sin (creal (z)) * sh) * I;
  77. return (w);
  78. }
  79. #if LDBL_MANT_DIG == DBL_MANT_DIG
  80. __strong_alias(ccosl, ccos);
  81. #endif /* LDBL_MANT_DIG == DBL_MANT_DIG */