zsqrt.cpp 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. /* zsqrt.f -- translated by f2c (version 20100827).
  2. This file no longer depends on f2c.
  3. */
  4. #include "slatec-internal.hpp"
  5. int zsqrt_(double *ar, double *ai, double *br,
  6. double *bi)
  7. {
  8. /* Initialized data */
  9. static double const drt = .7071067811865475244008443621;
  10. static double const dpi = 3.141592653589793238462643383;
  11. /* Local variables */
  12. double zm;
  13. double dtheta;
  14. /* ***BEGIN PROLOGUE ZSQRT */
  15. /* ***SUBSIDIARY */
  16. /* ***PURPOSE Subsidiary to ZBESH, ZBESI, ZBESJ, ZBESK, ZBESY, ZAIRY and */
  17. /* ZBIRY */
  18. /* ***LIBRARY SLATEC */
  19. /* ***TYPE ALL (ZSQRT-A) */
  20. /* ***AUTHOR Amos, D. E., (SNL) */
  21. /* ***DESCRIPTION */
  22. /* DOUBLE PRECISION COMPLEX SQUARE ROOT, B=CSQRT(A) */
  23. /* ***SEE ALSO ZAIRY, ZBESH, ZBESI, ZBESJ, ZBESK, ZBESY, ZBIRY */
  24. /* ***ROUTINES CALLED ZABS */
  25. /* ***REVISION HISTORY (YYMMDD) */
  26. /* 830501 DATE WRITTEN */
  27. /* 910415 Prologue converted to Version 4.0 format. (BAB) */
  28. /* ***END PROLOGUE ZSQRT */
  29. /* ***FIRST EXECUTABLE STATEMENT ZSQRT */
  30. zm = zabs_(ar, ai);
  31. zm = sqrt(zm);
  32. if (*ar == 0.) {
  33. goto L10;
  34. }
  35. if (*ai == 0.) {
  36. goto L20;
  37. }
  38. dtheta = atan(*ai / *ar);
  39. if (dtheta <= 0.) {
  40. goto L40;
  41. }
  42. if (*ar < 0.) {
  43. dtheta -= dpi;
  44. }
  45. goto L50;
  46. L10:
  47. if (*ai > 0.) {
  48. goto L60;
  49. }
  50. if (*ai < 0.) {
  51. goto L70;
  52. }
  53. *br = 0.;
  54. *bi = 0.;
  55. return 0;
  56. L20:
  57. if (*ar > 0.) {
  58. goto L30;
  59. }
  60. *br = 0.;
  61. *bi = sqrt((abs(*ar)));
  62. return 0;
  63. L30:
  64. *br = sqrt(*ar);
  65. *bi = 0.;
  66. return 0;
  67. L40:
  68. if (*ar < 0.) {
  69. dtheta += dpi;
  70. }
  71. L50:
  72. dtheta *= .5;
  73. *br = zm * cos(dtheta);
  74. *bi = zm * sin(dtheta);
  75. return 0;
  76. L60:
  77. *br = zm * drt;
  78. *bi = zm * drt;
  79. return 0;
  80. L70:
  81. *br = zm * drt;
  82. *bi = -zm * drt;
  83. return 0;
  84. } /* zsqrt_ */