program scalars
use M_anything,only : anyscalar_to_real
use,intrinsic :: iso_fortran_env, only : int8, int16, int32, int64
use,intrinsic :: iso_fortran_env, only : real32, real64, real128
implicit none
integer :: ios
integer(kind=int8) :: tiny= huge(0_int8)
integer(kind=int16) :: small= huge(0_int16 )
integer(kind=int32) :: medium= huge(0_int32)
integer(kind=int64) :: large= huge(0_int64)
real(kind=real32) :: rs= huge(0.0_real32)
real(kind=real64) :: rm= huge(0.0_real64)
real(kind=real128) :: rl= huge(0.0_real128)
101 format(a10,"|",i39,"|",i11,"|",i39)
102 format(a10,"|",g0,t55,"|",i11,"|",g0)
write(*,*)'First show the intrinsic variables of various KINDS we will be using'
write(*,*) ' NAME |VALUE |KIND(VALUE)|10**RANGE(VALUE)'
write(*,102) 'rs ',rs, kind(rs), 10.0_real32**range(rs)
write(*,102) 'rm ',rm, kind(rm), 10.0_real64**range(rm)
write(*,102) 'rl ',rl, kind(rl), 10.0_real128**range(rl)
write(*,102) 'tiny ',tiny, kind(tiny)
write(*,102) 'small ',small, kind(small)
write(*,102) 'medium ',medium, kind(medium)
write(*,102) 'large ',large, kind(large)
write(*,*)'Test squarei with all INTEGER KINDs:'
write(*,*)'(and given the following facts what is the expected output?)'
write(*,*)'FACTS:'
write(*,*)'127 * 127 = 16129'
write(*,*)'32767 * 32767 = 1073676289'
write(*,*)'2147483647 * 2147483647 = 4611686014132420609'
write(*,*)'9223372036854775807 * 9223372036854775807 = 85070591730234615847396907784232501249'
write(*,*)'170141183460469231731687303715884105727 * 170141183460469231731687303715884105727 =&
&28948022309329048855892746252171976962977213799489202546401021394546514198529'
write(*,*)'OUTPUT:'
202 format(a,*(g0:,'; '))
write(*,202,iostat=ios) 'SQUAREI() :',squarei(tiny), squarei(small), squarei(medium), squarei(large)
write(*,202,iostat=ios) 'SQUAREI() :', squarei(rs), squarei(rm), squarei(rl)
contains
!! THIS FUNCTION CAN TAKE AN INTEGER OR REAL OF ANY TYPE KNOWN TO ANYSCALAR_TO_REAL() AS AN ARGUMENT
function squarei(invalue) result (dvalue) ! square an integer value generically
use M_anything, only : anyscalar_to_real
implicit none
class(*),intent(in) :: invalue
real :: invalue_local
real :: dvalue
real,parameter :: biggest=sqrt(real(0.0,kind=real128))
invalue_local=anyscalar_to_real(invalue)
!if(invalue_local.gt.biggest)then
! write(*,*)'ERROR:*squarei* input value to big=',invalue_local
!endif
dvalue=invalue_local*invalue_local
end function squarei
end program scalars