dlamch function

double dlamch(
  1. String CMACH
)

Implementation

double dlamch(final String CMACH) {
  const ONE = 1.0, ZERO = 0.0;
  double RND, EPS, SFMIN, SMALL;

  // Assume rounding, not chopping. Always.

  RND = ONE;

  if (ONE == RND) {
    EPS = epsilon(ZERO) * 0.5;
  } else {
    EPS = epsilon(ZERO);
  }

  if (lsame(CMACH, 'E')) {
    return EPS;
  } else if (lsame(CMACH, 'S')) {
    SFMIN = tiny(ZERO);
    SMALL = ONE / huge(ZERO);
    if (SMALL >= SFMIN) {
      // Use SMALL plus a bit, to avoid the possibility of rounding
      // causing overflow when computing  1/sfmin.
      SFMIN = SMALL * (ONE + EPS);
    }
    return SFMIN;
  } else if (lsame(CMACH, 'B')) {
    return radix(ZERO);
  } else if (lsame(CMACH, 'P')) {
    return EPS * radix(ZERO);
  } else if (lsame(CMACH, 'N')) {
    return digits(ZERO).toDouble();
  } else if (lsame(CMACH, 'R')) {
    return RND;
  } else if (lsame(CMACH, 'M')) {
    return minexponent(ZERO).toDouble();
  } else if (lsame(CMACH, 'U')) {
    return tiny(ZERO);
  } else if (lsame(CMACH, 'L')) {
    return maxexponent(ZERO).toDouble();
  } else if (lsame(CMACH, 'O')) {
    return huge(ZERO);
  } else {
    return ZERO;
  }
}