dladiv function

void dladiv(
  1. double A,
  2. double B,
  3. double C,
  4. double D,
  5. Box<double> P,
  6. Box<double> Q,
)

Implementation

void dladiv(
  final double A,
  final double B,
  final double C,
  final double D,
  final Box<double> P,
  final Box<double> Q,
) {
  const BS = 2.0, HALF = 0.5, TWO = 2.0;

  final AA = Box(A);
  final BB = Box(B);
  var CC = C;
  var DD = D;
  var AB = max(A.abs(), B.abs());
  var CD = max(C.abs(), D.abs());
  var S = 1.0;

  final OV = dlamch('Overflow threshold');
  final UN = dlamch('Safe minimum');
  final EPS = dlamch('Epsilon');
  final BE = BS / (EPS * EPS);

  if (AB >= HALF * OV) {
    AA.value *= HALF;
    BB.value *= HALF;
    S *= TWO;
  }
  if (CD >= HALF * OV) {
    CC *= HALF;
    DD *= HALF;
    S *= HALF;
  }
  if (AB <= UN * BS / EPS) {
    AA.value *= BE;
    BB.value *= BE;
    S /= BE;
  }
  if (CD <= UN * BS / EPS) {
    CC *= BE;
    DD *= BE;
    S *= BE;
  }
  if (D.abs() <= C.abs()) {
    dladiv1(AA, BB.value, CC, DD, P, Q);
  } else {
    dladiv1(BB, AA.value, DD, CC, P, Q);
    Q.value = -Q.value;
  }
  P.value *= S;
  Q.value *= S;
}