1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- #include "slatec-internal.hpp"
- int zsqrt_(double *ar, double *ai, double *br,
- double *bi)
- {
-
- static double const drt = .7071067811865475244008443621;
- static double const dpi = 3.141592653589793238462643383;
-
- double zm;
- double dtheta;
- zm = zabs_(ar, ai);
- zm = sqrt(zm);
- if (*ar == 0.) {
- goto L10;
- }
- if (*ai == 0.) {
- goto L20;
- }
- dtheta = atan(*ai / *ar);
- if (dtheta <= 0.) {
- goto L40;
- }
- if (*ar < 0.) {
- dtheta -= dpi;
- }
- goto L50;
- L10:
- if (*ai > 0.) {
- goto L60;
- }
- if (*ai < 0.) {
- goto L70;
- }
- *br = 0.;
- *bi = 0.;
- return 0;
- L20:
- if (*ar > 0.) {
- goto L30;
- }
- *br = 0.;
- *bi = sqrt((abs(*ar)));
- return 0;
- L30:
- *br = sqrt(*ar);
- *bi = 0.;
- return 0;
- L40:
- if (*ar < 0.) {
- dtheta += dpi;
- }
- L50:
- dtheta *= .5;
- *br = zm * cos(dtheta);
- *bi = zm * sin(dtheta);
- return 0;
- L60:
- *br = zm * drt;
- *bi = zm * drt;
- return 0;
- L70:
- *br = zm * drt;
- *bi = -zm * drt;
- return 0;
- }
|