From Beliavsky@21:1/5 to All on Tue Apr 19 08:56:32 2022
Spacing(0.0_wp) is supposed to give the number adjacent to zero, but it looks like that is actually given by epsilon(x) * tiny(x) , which is smaller. The output of the program
program main
use iso_fortran_env, only: int32, real32
implicit none
integer, parameter :: ikind = int32, wp = real32
integer (kind=ikind) :: i, nbits
integer, parameter :: ni = 4
real(kind=wp) :: x
nbits = bit_size(i)
print*,"bit_size(i) =",nbits
print*,"epsilon(x) =",epsilon(x)
print*,"tiny(x) =",tiny(x)
print*,"epsilon(x) * tiny(x) =",epsilon(x)*tiny(x)
print*,"spacing(0.0_wp) =",spacing(0.0_wp)
print "(/,a12,a16)","i","transfer(i,x)"
do i=0,ni
print*,i,transfer(i,x)
end do
end program main
program main
use iso_fortran_env, only: int64, real64
implicit none
integer, parameter :: ikind = int64, wp = real64
integer (kind=ikind) :: i, nbits
integer, parameter :: ni = 4
real(kind=wp) :: x
nbits = bit_size(i)
print*,"bit_size(i) =",nbits
print*,"epsilon(x) =",epsilon(x)
print*,"tiny(x) =",tiny(x)
print*,"epsilon(x) * tiny(x) =",epsilon(x)*tiny(x)
print*,"spacing(0.0_wp) =",spacing(0.0_wp)
print "(/,a21,a16)","i","transfer(i,x)"
do i=0,ni
print*,i,transfer(i,x)
end do
end program main
From steve kargl@21:1/5 to Beliavsky on Tue Apr 19 19:10:03 2022
Beliavsky wrote:
Spacing(0.0_wp) is supposed to give the number adjacent to zero,
but it looks like that is actually given by epsilon(x) * tiny(x) , which
is smaller. The output of the program
If your processor supports subnormal number, first nonzero positive
closest to 0 is 2**(-p-emin).
% cat z.f90
program foo
print *, 2.**(minexponent(1.) - digits(1.))
end
% gfcx -o z a.f90 && ./z
1.40129846E-45
The IEEE facilities of Fortran allow to query about subnormal numbers.