dlas2 function

void dlas2(
  1. double F,
  2. double G,
  3. double H,
  4. Box<double> SSMIN,
  5. Box<double> SSMAX,
)

Implementation

void dlas2(
  final double F,
  final double G,
  final double H,
  final Box<double> SSMIN,
  final Box<double> SSMAX,
) {
  const ZERO = 0.0;
  const ONE = 1.0;
  const TWO = 2.0;
  double AS, AT, AU, C, FA, FHMN, FHMX, GA, HA;

  FA = F.abs();
  GA = G.abs();
  HA = H.abs();
  FHMN = min(FA, HA);
  FHMX = max(FA, HA);
  if (FHMN == ZERO) {
    SSMIN.value = ZERO;
    if (FHMX == ZERO) {
      SSMAX.value = GA;
    } else {
      SSMAX.value =
          max(FHMX, GA) * sqrt(ONE + pow(min(FHMX, GA) / max(FHMX, GA), 2));
    }
  } else {
    if (GA < FHMX) {
      AS = ONE + FHMN / FHMX;
      AT = (FHMX - FHMN) / FHMX;
      AU = pow(GA / FHMX, 2).toDouble();
      C = TWO / (sqrt(AS * AS + AU) + sqrt(AT * AT + AU));
      SSMIN.value = FHMN * C;
      SSMAX.value = FHMX / C;
    } else {
      AU = FHMX / GA;
      if (AU == ZERO) {
        // Avoid possible harmful underflow if exponent range
        // asymmetric (true SSMIN may not underflow even if
        // AU underflows)

        SSMIN.value = (FHMN * FHMX) / GA;
        SSMAX.value = GA;
      } else {
        AS = ONE + FHMN / FHMX;
        AT = (FHMX - FHMN) / FHMX;
        C = ONE / (sqrt(ONE + pow(AS * AU, 2)) + sqrt(ONE + pow(AT * AU, 2)));
        SSMIN.value = (FHMN * C) * AU;
        SSMIN.value += SSMIN.value;
        SSMAX.value = GA / (C + C);
      }
    }
  }
}