Controlling and querying the current numeric model#
exponent#
Name#
exponent(3) - [MODEL_COMPONENTS] Exponent of floating-point number
Synopsis#
result = exponent(x)
elemental integer function exponent(x)
real(kind=**),intent(in) :: x
Characteristics#
x shall be of type real of any valid kind
the result is a default integer type
Description#
exponent(3) returns the value of the exponent part of x, provided the exponent is within the range of default integers.
Options#
- x
the value to query the exponent of
Result#
exponent(3) returns the value of the exponent part of x
If x is zero the value returned is zero.
If x is an IEEE infinity or NaN, the result has the value HUGE(0).
Examples#
Sample program:
program demo_exponent
implicit none
real :: x = 1.0
integer :: i
i = exponent(x)
print *, i
print *, exponent(0.0)
print *, exponent([10.0,100.0,1000.0,-10000.0])
print *, 2**[10.0,100.0,1000.0,-10000.0]
print *, exponent(huge(0.0))
print *, exponent(tiny(0.0))
end program demo_exponent
Results:
> 4 7 10 14
> 128
> -125
Standard#
Fortran 95
See Also#
digits(3), epsilon(3), fraction(3), huge(3), maxexponent(3), minexponent(3), nearest(3), precision(3), radix(3), range(3), rrspacing(3), scale(3), set_exponent(3), spacing(3), tiny(3)
fortran-lang intrinsic descriptions
fraction#
Name#
fraction(3) - [MODEL_COMPONENTS] Fractional part of the model representation
Synopsis#
result = fraction(x)
elemental real(kind=KIND) function fraction(x)
real(kind=KIND),intent(in) :: fraction
Characteristics#
x is of type real
The result has the same characteristics as the argument.
Description#
fraction(3) returns the fractional part of the model representation of x.
Options#
- x
The value to interrogate
Result#
The fractional part of the model representation of x is returned; it is x * radix(x)**(-exponent(x)).
If x has the value zero, the result is zero.
If x is an IEEE NaN, the result is that NaN.
If x is an IEEE infinity, the result is an IEEE NaN.
Examples#
Sample program:
program demo_fraction
implicit none
real :: x
x = 178.1387e-4
print *, fraction(x), x * radix(x)**(-exponent(x))
end program demo_fraction
Results:
0.5700439 0.5700439
Standard#
Fortran 95
See Also#
digits(3), epsilon(3), exponent(3), huge(3), maxexponent(3), minexponent(3), nearest(3), precision(3), radix(3), range(3), rrspacing(3), scale(3), set_exponent(3), spacing(3), tiny(3)
fortran-lang intrinsic descriptions
nearest#
Name#
nearest(3) - [MODEL_COMPONENTS] Nearest representable number
Synopsis#
result = nearest(x, s)
elemental real(kind=KIND) function nearest(x,s)
real(kind=KIND),intent(in) :: x
real(kind=**),intent(in) :: s
Characteristics#
x may be a real value of any kind.
s may be a real value of any kind.
The return value is of the same type and kind as x.
a kind designated as ** may be any supported kind for the type
Description#
nearest(3) returns the processor-representable number nearest to x in the direction indicated by the sign of s.
Options#
- x
the value to find the nearest representable value of
- s
a non-zero value whose sign is used to determine the direction in which to search from x to the representable value.
If s is positive, nearest returns the processor-representable number greater than x and nearest to it.
If s is negative, nearest returns the processor-representable number smaller than x and nearest to it.
Result#
The return value is of the same type as x. If s is positive, nearest returns the processor-representable number greater than x and nearest to it. If s is negative, nearest returns the processor-representable number smaller than x and nearest to it.
Examples#
Sample program:
program demo_nearest
implicit none
real :: x, y
x = nearest(42.0, 1.0)
y = nearest(42.0, -1.0)
write (*,"(3(g20.15))") x, y, x - y
! write (*,"(3(g20.15))") &
! nearest(tiny(0.0),1.0), &
! nearest(tiny(0.0),-1.0), &
! nearest(tiny(0.0),1.0) -nearest(tiny(0.0),-1.0)
! write (*,"(3(g20.15))") &
! nearest(huge(0.0),1.0), &
! nearest(huge(0.0),-1.0), &
! nearest(huge(0.0),1.0)- nearest(huge(0.0),-1.0)
end program demo_nearest
Results:
42.0000038146973 41.9999961853027 .762939453125000E-05
Standard#
Fortran 95
See Also#
digits(3), epsilon(3), exponent(3), fraction(3), huge(3), maxexponent(3), minexponent(3), precision(3), radix(3), range(3), rrspacing(3), scale(3), set_exponent(3), spacing(3), tiny(3)
fortran-lang intrinsic descriptions
rrspacing#
Name#
rrspacing(3) - [MODEL_COMPONENTS] Reciprocal of the relative spacing of a numeric type
Synopsis#
result = rrspacing(x)
elemental real(kind=KIND) function rrspacing(x)
real(kind=KIND),intent(in) :: x
Characteristics#
x is type real an any kind
The return value is of the same type and kind as x.
Description#
rrspacing(3) returns the reciprocal of the relative spacing of model numbers near x.
Options#
- x
Shall be of type real.
Result#
The return value is of the same type and kind as x. The value returned is equal to abs(fraction(x)) * float(radix(x))**digits(x).
Standard#
Fortran 95
See Also#
digits(3), epsilon(3), exponent(3), fraction(3), huge(3), maxexponent(3), minexponent(3), nearest(3), precision(3), radix(3), range(3), scale(3), set_exponent(3), spacing(3), tiny(3)
fortran-lang intrinsic descriptions
scale#
Name#
scale(3) - [MODEL_COMPONENTS] Scale a real value by a whole power of the radix
Synopsis#
result = scale(x, i)
elemental real(kind=KIND) function scale(x, i)
real(kind=KIND),intent(in) :: x
integer(kind=**),intent(in) :: i
Characteristics#
x is type real of any kind
i is type an integer of any kind
the result is real of the same kind as x
Description#
scale(3) returns x * radix(x)**i.
It is almost certain the radix(base) of the platform is two, therefore scale(3) is generally the same as x*2**i
Options#
- x
the value to multiply by radix(x)**i. Its type and kind is used to determine the radix for values with its characteristics and determines the characteristics of the result, so care must be taken the returned value is within the range of the characteristics of x.
- i
The power to raise the radix of the machine to
Result#
The return value is x * radix(x)**i, assuming that value can be represented by a value of the type and kind of x.
Examples#
Sample program:
program demo_scale
implicit none
real :: x = 178.1387e-4
integer :: i = 5
print *, scale(x,i), x*radix(x)**i
end program demo_scale
Results:
0.570043862 0.570043862
Standard#
Fortran 95
See Also#
digits(3), epsilon(3), exponent(3), fraction(3), huge(3), maxexponent(3), minexponent(3), nearest(3), precision(3), radix(3), range(3), rrspacing(3), set_exponent(3), spacing(3), tiny(3)
fortran-lang intrinsic descriptions (license: MIT) @urbanjost
set_exponent#
Name#
set_exponent(3) - [MODEL_COMPONENTS] real value with specified exponent
Synopsis#
result = set_exponent(x, i)
elemental real(kind=KIND) function set_exponent(x,i)
real(kind=KIND),intent(in) :: x
integer(kind=**),intent(in) :: i
Characteristics#
x is type real
i is type integer
a kind designated as ** may be any supported kind for the type
The return value is of the same type and kind as x.
Description#
set_exponent(3) returns the real number whose fractional part is that of x and whose exponent part is i.
Options#
- x
Shall be of type real.
- i
Shall be of type integer.
Result#
The return value is of the same type and kind as x. The real number whose fractional part is that of x and whose exponent part if i is returned; it is fraction(x) * radix(x)**i.
If x has the value zero, the result has the same value as x.
If x is an IEEE infinity, the result is an IEEE NaN.
If x is an IEEE NaN, the result is the same NaN.
Examples#
Sample program:
program demo_setexp
implicit none
real :: x = 178.1387e-4
integer :: i = 17
print *, set_exponent(x, i), fraction(x) * radix(x)**i
end program demo_setexp
Results:
74716.7891 74716.7891
Standard#
Fortran 95
See Also#
digits(3), epsilon(3), exponent(3), fraction(3), huge(3), maxexponent(3), minexponent(3), nearest(3), precision(3), radix(3), range(3), rrspacing(3), scale(3), spacing(3), tiny(3)
fortran-lang intrinsic descriptions
spacing#
Name#
spacing(3) - [MODEL_COMPONENTS] Smallest distance between two numbers of a given type
Synopsis#
result = spacing(x)
elemental real(kind=KIND) function spacing(x)
real(kind=KIND), intent(in) :: x
Characteristics#
x is type real of any valid kind
The result is of the same type as the input argument x.
Description#
spacing(3) determines the distance between the argument x and the nearest adjacent number of the same type.
Options#
- x
Shall be of type real.
Result#
If x does not have the value zero and is not an IEEE infinity or NaN, the result has the value nearest to x for values of the same type and kind assuming the value is representable.
Otherwise, the value is the same as tiny(x). + zero produces tiny(x) + IEEE Infinity produces an IEEE Nan + if an IEEE NaN, that NaN is returned
If there are two extended model values equally near to x, the value of greater absolute value is taken.
Examples#
Sample program:
program demo_spacing
implicit none
integer, parameter :: sgl = selected_real_kind(p=6, r=37)
integer, parameter :: dbl = selected_real_kind(p=13, r=200)
write(*,*) spacing(1.0_sgl)
write(*,*) nearest(1.0_sgl,+1.0),nearest(1.0_sgl,+1.0)-1.0
write(*,*) spacing(1.0_dbl)
end program demo_spacing
Results:
Typical values …
1.1920929E-07
1.000000 1.1920929E-07
0.9999999 -5.9604645E-08
2.220446049250313E-016
Standard#
Fortran 95
See Also#
digits(3), epsilon(3), exponent(3), fraction(3), huge(3), maxexponent(3), minexponent(3), nearest(3), precision(3), radix(3), range(3), rrspacing(3), scale(3), set_exponent(3), tiny(3)
fortran-lang intrinsic descriptions (license: MIT) @urbanjost
digits#
Name#
digits(3) - [NUMERIC MODEL] Significant digits in the numeric model
Synopsis#
result = digits(x)
integer function digits(x)
TYPE(kind=KIND),intent(in) :: x(..)
Characteristics#
x an integer or real scalar or array
The return value is an integer of default kind.
Description#
digits(3) returns the number of significant digits of the internal model representation of x. For example, on a system using a 32-bit floating point representation, a default real number would likely return 24.
Options#
- x
a value of the type and kind to query
Result#
The number of significant digits in a variable of the type and kind of x.
Examples#
Sample program:
program demo_digits
implicit none
integer :: i = 12345
real :: x = 3.143
doubleprecision :: y = 2.33d0
print *,'default integer:', digits(i)
print *,'default real: ', digits(x)
print *,'default doubleprecision:', digits(y)
end program demo_digits
Results:
> default integer: 31
> default real: 24
> default doubleprecision: 53
Standard#
Fortran 95
See Also#
epsilon(3), exponent(3), fraction(3), huge(3), maxexponent(3), minexponent(3), nearest(3), precision(3), radix(3), range(3), rrspacing(3), scale(3), set_exponent(3), spacing(3), tiny(3)
fortran-lang intrinsic descriptions (license: MIT) @urbanjost
epsilon#
Name#
epsilon(3) - [NUMERIC MODEL] Epsilon function
Synopsis#
result = epsilon(x)
real(kind=kind(x)) function epsilon(x)
real(kind=kind(x),intent(in) :: x(..)
Characteristics#
x shall be of type real. It may be a scalar or an array.
the result is a scalar of the same type and kind type parameter as x.
Description#
epsilon(3) returns the floating point relative accuracy. It is the nearly negligible number relative to 1 such that 1+ little_number is not equal to 1; or more precisely
real( 1.0, kind(x)) + epsilon(x) /= real( 1.0, kind(x))
It may be thought of as the distance from 1.0 to the next largest floating point number.
One use of epsilon(3) is to select a delta value for algorithms that search until the calculation is within delta of an estimate.
If delta is too small the algorithm might never halt, as a computation summing values smaller than the decimal resolution of the data type does not change.
Options#
- x
The type shall be real.
Result#
The return value is of the same type as the argument.
Examples#
Sample program:
program demo_epsilon
use,intrinsic :: iso_fortran_env, only : dp=>real64,sp=>real32
implicit none
real(kind=sp) :: x = 3.143
real(kind=dp) :: y = 2.33d0
! so if x is of type real32, epsilon(x) has the value 2**-23
print *, epsilon(x)
! note just the type and kind of x matter, not the value
print *, epsilon(huge(x))
print *, epsilon(tiny(x))
! the value changes with the kind of the real value though
print *, epsilon(y)
! adding and subtracting epsilon(x) changes x
write(*,*)x == x + epsilon(x)
write(*,*)x == x - epsilon(x)
! these next two comparisons will be .true. !
write(*,*)x == x + epsilon(x) * 0.999999
write(*,*)x == x - epsilon(x) * 0.999999
! you can calculate epsilon(1.0d0)
write(*,*)my_dp_eps()
contains
function my_dp_eps()
! calculate the epsilon value of a machine the hard way
real(kind=dp) :: t
real(kind=dp) :: my_dp_eps
! starting with a value of 1, keep dividing the value
! by 2 until no change is detected. Note that with
! infinite precision this would be an infinite loop,
! but floating point values in Fortran have a defined
! and limited precision.
my_dp_eps = 1.0d0
SET_ST: do
my_dp_eps = my_dp_eps/2.0d0
t = 1.0d0 + my_dp_eps
if (t <= 1.0d0) exit
enddo SET_ST
my_dp_eps = 2.0d0*my_dp_eps
end function my_dp_eps
end program demo_epsilon
Results:
1.1920929E-07
1.1920929E-07
1.1920929E-07
2.220446049250313E-016
F
F
T
T
2.220446049250313E-016
Standard#
Fortran 95
See Also#
digits(3), exponent(3), fraction(3), huge(3), maxexponent(3), minexponent(3), nearest(3), precision(3), radix(3), range(3), rrspacing(3), scale(3), set_exponent(3), spacing(3), tiny(3)
fortran-lang intrinsic descriptions (license: MIT) @urbanjost
huge#
Name#
huge(3) - [NUMERIC MODEL] Largest number of a type and kind
Synopsis#
result = huge(x)
TYPE(kind=KIND) function huge(x)
TYPE(kind=KIND),intent(in) :: x(..)
Characteristics#
x may be any real or integer scalar or array and any kind.
The result will be a scalar of the same type and kind as the input x
Description#
huge(3) returns the largest number that is not an overflow for the kind and type of x.
Options#
- x
x is an arbitrary value which is used merely to determine what kind and type of scalar is being queried. It need not be defined, as only its characteristics are used.
Result#
The result is the largest value supported by the specified type and kind.
Note the result is as the same kind as the input to ensure the returned value does not overflow. Any assignment of the result to a variable should take this into consideration.
Examples#
Sample program:
program demo_huge
implicit none
character(len=*),parameter :: f='(i2,1x,2(i11,1x),f14.0:,1x,l1,1x,a)'
integer :: i,j,k,biggest
real :: v, w
! basic
print *, huge(0), huge(0.0), huge(0.0d0)
print *, tiny(0.0), tiny(0.0d0)
sum=0.0d0
! note subtracting one because counter is the end value+1 on exit
do i=0,huge(0)-1
sum=sum+i
enddo
write(*,*)'sum=',sum
! advanced
biggest=huge(0)
! be careful of overflow when using integers in computation
do i=1,14
j=6**i ! Danger, Danger
w=6**i ! Danger, Danger
v=6.0**i
k=v ! Danger, Danger
if(v.gt.biggest)then
write(*,f) i, j, k, v, v.eq.w, 'wrong j and k and w'
else
write(*,f) i, j, k, v, v.eq.w
endif
enddo
end program demo_huge
Results:
2147483647 3.4028235E+38 1.797693134862316E+308
1.1754944E-38 2.225073858507201E-308
1 6 6 6. T
2 36 36 36. T
3 216 216 216. T
4 1296 1296 1296. T
5 7776 7776 7776. T
6 46656 46656 46656. T
7 279936 279936 279936. T
8 1679616 1679616 1679616. T
9 10077696 10077696 10077696. T
10 60466176 60466176 60466176. T
11 362797056 362797056 362797056. T
12 -2118184960 -2147483648 2176782336. F wrong for j and k and w
13 175792128 -2147483648 13060694016. F wrong for j and k and w
14 1054752768 -2147483648 78364164096. F wrong for j and k and w
Standard#
Fortran 95
See Also#
digits(3), epsilon(3), exponent(3), fraction(3), maxexponent(3), minexponent(3), nearest(3), precision(3), radix(3), range(3), rrspacing(3), scale(3), set_exponent(3), spacing(3), tiny(3)
fortran-lang intrinsic descriptions (license: MIT) @urbanjost
maxexponent#
Name#
maxexponent(3) - [NUMERIC MODEL] Maximum exponent of a real kind
Synopsis#
result = maxexponent(x)
elemental integer function maxexponent(x)
real(kind=**),intent(in) :: x
Characteristics#
x is a real scalar or array of any real kind
the result is a default integer scalar
Description#
maxexponent(3) returns the maximum exponent in the model of the type of x.
Options#
- x
A value used to select the kind of real to return a value for.
Result#
The value returned is the maximum exponent for the kind of the value queried
Examples#
Sample program:
program demo_maxexponent
use, intrinsic :: iso_fortran_env, only : real32,real64,real128
implicit none
character(len=*),parameter :: g='(*(g0,1x))'
print g, minexponent(0.0_real32), maxexponent(0.0_real32)
print g, minexponent(0.0_real64), maxexponent(0.0_real64)
print g, minexponent(0.0_real128), maxexponent(0.0_real128)
end program demo_maxexponent
Results:
-125 128
-1021 1024
-16381 16384
Standard#
Fortran 95
See Also#
digits(3), epsilon(3), exponent(3), fraction(3), huge(3), minexponent(3), nearest(3), precision(3), radix(3), range(3), rrspacing(3), scale(3), set_exponent(3), spacing(3), tiny(3)
fortran-lang intrinsic descriptions (license: MIT) @urbanjost
minexponent#
Name#
minexponent(3) - [NUMERIC MODEL] Minimum exponent of a real kind
Synopsis#
result = minexponent(x)
elemental integer function minexponent(x)
real(kind=**),intent(in) :: x
Characteristics#
x is a real scalar or array of any real kind
the result is a default integer scalar
Description#
minexponent(3) returns the minimum exponent in the model of the type of x.
Options#
- x
A value used to select the kind of real to return a value for.
Result#
The value returned is the maximum exponent for the kind of the value queried
Examples#
Sample program:
program demo_minexponent
use, intrinsic :: iso_fortran_env, only : &
&real_kinds, real32, real64, real128
implicit none
real(kind=real32) :: x
real(kind=real64) :: y
print *, minexponent(x), maxexponent(x)
print *, minexponent(y), maxexponent(y)
end program demo_minexponent
Expected Results:
-125 128
-1021 1024
Standard#
Fortran 95
See Also#
digits(3), epsilon(3), exponent(3), fraction(3), huge(3), maxexponent(3), nearest(3), precision(3), radix(3), range(3), rrspacing(3), scale(3), set_exponent(3), spacing(3), tiny(3)
fortran-lang intrinsic descriptions (license: MIT) @urbanjost
precision#
Name#
precision(3) - [NUMERIC MODEL] Decimal precision of a real kind
Synopsis#
result = precision(x)
integer function precision(x)
TYPE(kind=**),intent(in) :: x
Characteristics#
x shall be of type real or complex. It may be a scalar or an array.
the result is a default integer scalar.
Description#
precision(3) returns the decimal precision in the model of the type of x.
Options#
- x
the type and kind of the argument are used to determine which number model to query. The value of the argument is not unused; it may even be undefined.
Result#
The precision of values of the type and kind of x
Examples#
Sample program:
program demo_precision
use,intrinsic :: iso_fortran_env, only : dp=>real64,sp=>real32
implicit none
real(kind=sp) :: x(2)
complex(kind=dp) :: y
print *, precision(x), range(x)
print *, precision(y), range(y)
end program demo_precision
Results:
> 6 37
> 15 307
Standard#
Fortran 95
See Also#
digits(3), epsilon(3), exponent(3), fraction(3), huge(3), maxexponent(3), minexponent(3), nearest(3), radix(3), range(3), rrspacing(3), scale(3), set_exponent(3), spacing(3), tiny(3)
fortran-lang intrinsic descriptions (license: MIT) @urbanjost
radix#
Name#
radix(3) - [NUMERIC MODEL] Base of a numeric model
Synopsis#
result = radix(x)
integer function radix(x)
TYPE(kind=**),intent(in) :: x(..)
Characteristics#
x may be scalar or an array of any real or integer type.
the result is a default integer scalar.
Description#
radix(3) returns the base of the internal model representing the numeric entity x.
In a positional numeral system, the radix or base is the number of unique digits, including the digit zero, used to represent numbers.
This function helps to represent the internal computing model generically, but will be 2 (representing a binary machine) for any common platform for all the numeric types.
Options#
- x
used to identify the type of number to query.
Result#
The returned value indicates what base is internally used to represent the type of numeric value x represents.
Examples#
Sample program:
program demo_radix
implicit none
print *, "The radix for the default integer kind is", radix(0)
print *, "The radix for the default real kind is", radix(0.0)
print *, "The radix for the doubleprecision real kind is", radix(0.0d0)
end program demo_radix
Results:
> The radix for the default integer kind is 2
> The radix for the default real kind is 2
> The radix for the doubleprecision real kind is 2
Standard#
Fortran 95
See Also#
digits(3), epsilon(3), exponent(3), fraction(3), huge(3), maxexponent(3), minexponent(3), nearest(3), precision(3), range(3), rrspacing(3), scale(3), set_exponent(3), spacing(3), tiny(3)
fortran-lang intrinsic descriptions (license: MIT) @urbanjost
range#
Name#
range(3) - [NUMERIC MODEL] Decimal exponent range of a numeric kind
Synopsis#
result = range(x)
integer function range (x)
TYPE(kind=KIND),intent(in) :: x
Characteristics#
x may be of type integer, real, or complex. It may be a scalar or an array.
KIND is any kind supported by the type of x
the result is a default integer scalar
Description#
range(3) returns the decimal exponent range in the model of the type of x.
Since x is only used to determine the type and kind being interrogated, the value need not be defined.
Options#
- x
the value whose type and kind are used for the query
Result#
- Case (i)
For an integer argument, the result has the value
int (log10 (huge(x)))
- Case (ii)
For a real argument, the result has the value
int(min (log10 (huge(x)), -log10(tiny(x) )))
- Case (iii)
For a complex argument, the result has the value
range(real(x))
Examples#
Sample program:
program demo_range
use,intrinsic :: iso_fortran_env, only : dp=>real64,sp=>real32
implicit none
real(kind=sp) :: x(2)
complex(kind=dp) :: y
print *, precision(x), range(x)
print *, precision(y), range(y)
end program demo_range
Results:
> 6 37
> 15 307
Standard#
Fortran 95
See Also#
digits(3), epsilon(3), exponent(3), fraction(3), huge(3), maxexponent(3), minexponent(3), nearest(3), precision(3), radix(3), rrspacing(3), scale(3), set_exponent(3), spacing(3), tiny(3)
fortran-lang intrinsic descriptions (license: MIT) @urbanjost
tiny#
Name#
tiny(3) - [NUMERIC MODEL] Smallest positive number of a real kind
Synopsis#
result = tiny(x)
real(kind=KIND) function tiny(x)
real(kind=KIND) :: x
Characteristics#
x may be any real scalar or array
the result has the same type and kind as x
Description#
tiny(3) returns the smallest positive (non zero) number of the type and kind of x.
For real x
result = 2.0**(minexponent(x)-1)
Options#
- x
The value whose kind is used to determine the model type to query
Result#
The smallest positive value for the real type of the specified kind.
Examples#
Sample program:
program demo_tiny
implicit none
print *, 'default real is from', tiny(0.0), 'to',huge(0.0)
print *, 'doubleprecision is from ', tiny(0.0d0), 'to',huge(0.0d0)
end program demo_tiny
Results:
default real is from 1.17549435E-38 to 3.40282347E+38
doubleprecision is from 2.2250738585072014E-308 to
1.7976931348623157E+308
Standard#
Fortran 95
See Also#
digits(3), epsilon(3), exponent(3), fraction(3), huge(3), maxexponent(3), minexponent(3), nearest(3), precision(3), radix(3), range(3), rrspacing(3), scale(3), set_exponent(3), spacing(3)
fortran-lang intrinsic descriptions (license: MIT) @urbanjost