dlamch function
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;
}
}