zs1s2.cpp 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. /* zs1s2.f -- translated by f2c (version 20100827).
  2. This file no longer depends on f2c.
  3. */
  4. #include "slatec-internal.hpp"
  5. int zs1s2_(double *zrr, double *zri, double *s1r,
  6. double *s1i, double *s2r, double *s2i, integer *nz,
  7. double *ascle, double *alim, integer *iuf)
  8. {
  9. /* Initialized data */
  10. static double const zeror = 0.;
  11. static double const zeroi = 0.;
  12. /* Local variables */
  13. double aa, c1i, as1, as2, c1r, aln, s1di, s1dr;
  14. integer idum;
  15. /* ***BEGIN PROLOGUE ZS1S2 */
  16. /* ***SUBSIDIARY */
  17. /* ***PURPOSE Subsidiary to ZAIRY and ZBESK */
  18. /* ***LIBRARY SLATEC */
  19. /* ***TYPE ALL (CS1S2-A, ZS1S2-A) */
  20. /* ***AUTHOR Amos, D. E., (SNL) */
  21. /* ***DESCRIPTION */
  22. /* ZS1S2 TESTS FOR A POSSIBLE UNDERFLOW RESULTING FROM THE */
  23. /* ADDITION OF THE I AND K FUNCTIONS IN THE ANALYTIC CON- */
  24. /* TINUATION FORMULA WHERE S1=K FUNCTION AND S2=I FUNCTION. */
  25. /* ON KODE=1 THE I AND K FUNCTIONS ARE DIFFERENT ORDERS OF */
  26. /* MAGNITUDE, BUT FOR KODE=2 THEY CAN BE OF THE SAME ORDER */
  27. /* OF MAGNITUDE AND THE MAXIMUM MUST BE AT LEAST ONE */
  28. /* PRECISION ABOVE THE UNDERFLOW LIMIT. */
  29. /* ***SEE ALSO ZAIRY, ZBESK */
  30. /* ***ROUTINES CALLED ZABS, ZEXP, ZLOG */
  31. /* ***REVISION HISTORY (YYMMDD) */
  32. /* 830501 DATE WRITTEN */
  33. /* 910415 Prologue converted to Version 4.0 format. (BAB) */
  34. /* 930122 Added ZEXP and ZLOG to EXTERNAL statement. (RWC) */
  35. /* ***END PROLOGUE ZS1S2 */
  36. /* COMPLEX CZERO,C1,S1,S1D,S2,ZR */
  37. /* ***FIRST EXECUTABLE STATEMENT ZS1S2 */
  38. *nz = 0;
  39. as1 = zabs_(s1r, s1i);
  40. as2 = zabs_(s2r, s2i);
  41. if (*s1r == 0. && *s1i == 0.) {
  42. goto L10;
  43. }
  44. if (as1 == 0.) {
  45. goto L10;
  46. }
  47. aln = -(*zrr) - *zrr + log(as1);
  48. s1dr = *s1r;
  49. s1di = *s1i;
  50. *s1r = zeror;
  51. *s1i = zeroi;
  52. as1 = zeror;
  53. if (aln < -(*alim)) {
  54. goto L10;
  55. }
  56. zlog_(&s1dr, &s1di, &c1r, &c1i, &idum);
  57. c1r = c1r - *zrr - *zrr;
  58. c1i = c1i - *zri - *zri;
  59. zexp_(&c1r, &c1i, s1r, s1i);
  60. as1 = zabs_(s1r, s1i);
  61. ++(*iuf);
  62. L10:
  63. aa = max(as1,as2);
  64. if (aa > *ascle) {
  65. return 0;
  66. }
  67. *s1r = zeror;
  68. *s1i = zeroi;
  69. *s2r = zeror;
  70. *s2i = zeroi;
  71. *nz = 1;
  72. *iuf = 0;
  73. return 0;
  74. } /* zs1s2_ */