Return floating point (double precision) machine dependent constants.
D1MACH can be used to obtain machine-dependent parameters for the local machine environment. It is a function subprogram with one (input) argument, and can be referenced as follows:
A = D1MACH(I)
where I=1,...,5. The (output) value of A above is determined by
the (input) value of I. The results for various values of I are
discussed below.
D1MACH(1) = B**(EMIN-1), the smallest positive magnitude.D1MACH(2) = B**EMAX*(1 - B**(-T)), the largest magnitude.D1MACH(3) = B**(-T), the smallest relative spacing.D1MACH(4) = B**(1-T), the largest relative spacing.D1MACH(5) = LOG10(B)Assume single precision numbers are represented in the T-digit,
base-B form
sign (B**E)*( (X(1)/B) + ... + (X(T)/B**T) )
where 0 <= X(I) < B for I=1,...,T, 0 < X(1), and
EMIN <= E <= EMAX.
The values of B, T, EMIN and EMAX are provided in i1mach as
follows:
I1MACH(10) = B, the base.I1MACH(11) = T, the number of base-B digits.I1MACH(12) = EMIN, the smallest exponent E.I1MACH(13) = EMAX, the largest exponent E.| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer, | intent(in) | :: | i |
pure real(dp) function d1mach(i)
integer, intent(in) :: i
real(dp), parameter :: x = 1.0_dp
real(dp), parameter :: b = real(radix(x), dp)
select case (i)
case (1); d1mach = b**(minexponent(x) - 1) ! the smallest positive magnitude.
case (2); d1mach = huge(x) ! the largest magnitude.
case (3); d1mach = b**(-digits(x)) ! the smallest relative spacing.
case (4); d1mach = b**(1 - digits(x)) ! the largest relative spacing.
case (5); d1mach = log10(b)
case default
error stop 'Error in d1mach - i out of bounds'
end select
end function d1mach