/* dladiv.f -- translated by f2c (version 20061008).
   You must link the resulting object file with libf2c:
        on Microsoft Windows system, link with libf2c.lib;
        on Linux or Unix systems, link with .../path/to/libf2c.a -lm
        or, if you install libf2c.a in a standard place, with -lf2c -lm
        -- in that order, at the end of the command line, as in
                cc *.o -lf2c -lm
        Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,

                http://www.netlib.org/f2c/libf2c.zip
*/

#include "blaswrap.h"
#include "lapack_datatypes.h"

/* Subroutine */ void dladiv_(doublereal *a, doublereal *b, doublereal *c__, doublereal *d__, doublereal *p,
                              doublereal *q) {
  doublereal e, f;

  /*  -- LAPACK auxiliary routine (version 3.2) -- */
  /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
  /*     November 2006 */

  /*     .. Scalar Arguments .. */
  /*     .. */

  /*  Purpose */
  /*  ======= */

  /*  DLADIV performs complex division in  real arithmetic */

  /*                        a + i*b */
  /*             p + i*q = --------- */
  /*                        c + i*d */

  /*  The algorithm is due to Robert L. Smith and can be found */
  /*  in D. Knuth, The art of Computer Programming, Vol.2, p.195 */

  /*  Arguments */
  /*  ========= */

  /*  A       (input) DOUBLE PRECISION */
  /*  B       (input) DOUBLE PRECISION */
  /*  C       (input) DOUBLE PRECISION */
  /*  D       (input) DOUBLE PRECISION */
  /*          The scalars a, b, c, and d in the above expression. */

  /*  P       (output) DOUBLE PRECISION */
  /*  Q       (output) DOUBLE PRECISION */
  /*          The scalars p and q in the above expression. */

  /*  ===================================================================== */

  /*     .. Local Scalars .. */
  /*     .. */
  /*     .. Intrinsic Functions .. */
  /*     .. */
  /*     .. Executable Statements .. */

  if (abs(*d__) < abs(*c__)) {
    e = *d__ / *c__;
    f = *c__ + *d__ * e;
    *p = (*a + *b * e) / f;
    *q = (*b - *a * e) / f;
  } else {
    e = *c__ / *d__;
    f = *d__ + *c__ * e;
    *p = (*b + *a * e) / f;
    *q = (-(*a) + *b * e) / f;
  }

  /*     End of DLADIV */

} /* dladiv_ */
