37 #if (defined(MODEL_SICOPOLIS)) 44 public :: approx_equal, approx_equal_integer, approx_integer_multiple
46 #if (!defined(MODEL_SICOPOLIS)) 47 integer,
parameter :: sp = kind(1.0)
48 integer,
parameter :: dp = kind(1.0d0)
51 interface approx_equal
52 procedure :: approx_equal_sp, approx_equal_dp
55 interface approx_equal_integer
56 procedure :: approx_equal_integer_sp, approx_equal_integer_dp
59 interface approx_integer_multiple
60 procedure :: approx_integer_multiple_sp, approx_integer_multiple_dp
69 function approx_equal_sp(x, y, eps)
73 real(sp),
intent(in) :: x, y
74 real(sp),
intent(in) :: eps
76 logical :: approx_equal_sp
78 if ( abs(x-y) <= abs(x+y)*eps )
then 79 approx_equal_sp = .true.
81 approx_equal_sp = .false.
84 end function approx_equal_sp
90 function approx_equal_dp(x, y, eps)
94 real(dp),
intent(in) :: x, y
95 real(dp),
intent(in) :: eps
97 logical :: approx_equal_dp
99 if ( abs(x-y) <= abs(x+y)*eps )
then 100 approx_equal_dp = .true.
102 approx_equal_dp = .false.
105 end function approx_equal_dp
111 function approx_equal_integer_sp(x, eps)
115 real(sp),
intent(in) :: x
116 real(sp),
intent(in) :: eps
118 logical :: approx_equal_integer_sp
120 if (x == 0.0_sp)
then 121 approx_equal_integer_sp = .true.
122 else if (approx_equal_sp(x,
real(nint(x),sp), eps)) then
123 approx_equal_integer_sp = .true.
125 approx_equal_integer_sp = .false.
128 end function approx_equal_integer_sp
134 function approx_equal_integer_dp(x, eps)
138 real(dp),
intent(in) :: x
139 real(dp),
intent(in) :: eps
141 logical :: approx_equal_integer_dp
143 if (x == 0.0_dp)
then 144 approx_equal_integer_dp = .true.
145 else if (approx_equal_dp(x,
real(nint(x),dp), eps)) then
146 approx_equal_integer_dp = .true.
148 approx_equal_integer_dp = .false.
151 end function approx_equal_integer_dp
157 function approx_integer_multiple_sp(x, y, eps)
161 real(sp),
intent(in) :: x, y
162 real(sp),
intent(in) :: eps
164 logical :: approx_integer_multiple_sp
166 if (y == 0.0_sp)
then 167 approx_integer_multiple_sp = .false.
168 else if (nint(x/y) == 0)
then 169 approx_integer_multiple_sp = .false.
170 else if (approx_equal_integer_sp(x/y, eps))
then 171 approx_integer_multiple_sp = .true.
173 approx_integer_multiple_sp = .false.
176 end function approx_integer_multiple_sp
182 function approx_integer_multiple_dp(x, y, eps)
186 real(dp),
intent(in) :: x, y
187 real(dp),
intent(in) :: eps
189 logical :: approx_integer_multiple_dp
191 if (y == 0.0_dp)
then 192 approx_integer_multiple_dp = .false.
193 else if (nint(x/y) == 0)
then 194 approx_integer_multiple_dp = .false.
195 else if (approx_equal_integer_dp(x/y, eps))
then 196 approx_integer_multiple_dp = .true.
198 approx_integer_multiple_dp = .false.
201 end function approx_integer_multiple_dp
Declarations of kind types for SICOPOLIS.
Comparison of single- or double-precision floating-point numbers.