1 !===-- module/ieee_arithmetic.f90 ------------------------------------------===!
3 ! Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 ! See https://llvm.org/LICENSE.txt for license information.
5 ! SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 !===------------------------------------------------------------------------===!
9 ! Fortran 2018 Clause 17
11 module ieee_arithmetic
12 ! 17.1: "The module IEEE_ARITHMETIC behaves as if it contained a
13 ! USE statement for IEEE_EXCEPTIONS; everything that is public in
14 ! IEEE_EXCEPTIONS is public in IEEE_ARITHMETIC."
15 use __Fortran_ieee_exceptions
17 use __Fortran_builtins
, only
: &
18 ieee_is_nan
=> __builtin_ieee_is_nan
, &
19 ieee_is_negative
=> __builtin_ieee_is_negative
, &
20 ieee_is_normal
=> __builtin_ieee_is_normal
, &
21 ieee_next_after
=> __builtin_ieee_next_after
, &
22 ieee_next_down
=> __builtin_ieee_next_down
, &
23 ieee_next_up
=> __builtin_ieee_next_up
, &
24 ieee_scalb
=> scale
, &
25 ieee_selected_real_kind
=> __builtin_ieee_selected_real_kind
, &
26 ieee_support_datatype
=> __builtin_ieee_support_datatype
, &
27 ieee_support_denormal
=> __builtin_ieee_support_denormal
, &
28 ieee_support_divide
=> __builtin_ieee_support_divide
, &
29 ieee_support_inf
=> __builtin_ieee_support_inf
, &
30 ieee_support_io
=> __builtin_ieee_support_io
, &
31 ieee_support_nan
=> __builtin_ieee_support_nan
, &
32 ieee_support_sqrt
=> __builtin_ieee_support_sqrt
, &
33 ieee_support_standard
=> __builtin_ieee_support_standard
, &
34 ieee_support_subnormal
=> __builtin_ieee_support_subnormal
, &
35 ieee_support_underflow_control
=> __builtin_ieee_support_underflow_control
39 type :: ieee_class_type
41 integer(kind
=1) :: which
= 0
42 end type ieee_class_type
44 type(ieee_class_type
), parameter :: &
45 ieee_signaling_nan
= ieee_class_type(1), &
46 ieee_quiet_nan
= ieee_class_type(2), &
47 ieee_negative_inf
= ieee_class_type(3), &
48 ieee_negative_normal
= ieee_class_type(4), &
49 ieee_negative_denormal
= ieee_class_type(5), &
50 ieee_negative_zero
= ieee_class_type(6), &
51 ieee_positive_zero
= ieee_class_type(7), &
52 ieee_positive_subnormal
= ieee_class_type(8), &
53 ieee_positive_normal
= ieee_class_type(9), &
54 ieee_positive_inf
= ieee_class_type(10), &
55 ieee_other_value
= ieee_class_type(11)
57 type(ieee_class_type
), parameter :: &
58 ieee_negative_subnormal
= ieee_negative_denormal
, &
59 ieee_positive_denormal
= ieee_negative_subnormal
61 type :: ieee_round_type
63 integer(kind
=1) :: mode
= 0
64 end type ieee_round_type
66 type(ieee_round_type
), parameter :: &
67 ieee_nearest
= ieee_round_type(1), &
68 ieee_to_zero
= ieee_round_type(2), &
69 ieee_up
= ieee_round_type(3), &
70 ieee_down
= ieee_round_type(4), &
71 ieee_away
= ieee_round_type(5), &
72 ieee_other
= ieee_round_type(6)
74 interface operator(==)
75 elemental
logical function ieee_class_eq(x
, y
)
76 import ieee_class_type
77 type(ieee_class_type
), intent(in
) :: x
, y
78 end function ieee_class_eq
79 elemental
logical function ieee_round_eq(x
, y
)
80 import ieee_round_type
81 type(ieee_round_type
), intent(in
) :: x
, y
82 end function ieee_round_eq
83 end interface operator(==)
84 interface operator(/=)
85 elemental
logical function ieee_class_ne(x
, y
)
86 import ieee_class_type
87 type(ieee_class_type
), intent(in
) :: x
, y
88 end function ieee_class_ne
89 elemental
logical function ieee_round_ne(x
, y
)
90 import ieee_round_type
91 type(ieee_round_type
), intent(in
) :: x
, y
92 end function ieee_round_ne
93 end interface operator(/=)
94 private
:: ieee_class_eq
, ieee_round_eq
, ieee_class_ne
, ieee_round_ne
96 ! Define specifics with 1 or 2 INTEGER, LOGICAL, or REAL arguments for
98 #define
SPECIFICS_I(G
) \
99 G(1) G(2) G(4) G(8) G(16)
100 #define
SPECIFICS_L(G
) \
102 #define
SPECIFICS_R(G
) \
103 G(2) G(3) G(4) G(8) G(10) G(16)
104 #define
SPECIFICS_II(G
) \
105 G(1,1) G(1,2) G(1,4) G(1,8) G(1,16) \
106 G(2,1) G(2,2) G(2,4) G(2,8) G(2,16) \
107 G(4,1) G(4,2) G(4,4) G(4,8) G(4,16) \
108 G(8,1) G(8,2) G(8,4) G(8,8) G(8,16) \
109 G(16,1) G(16,2) G(16,4) G(16,8) G(16,16)
110 #define
SPECIFICS_RI(G
) \
111 G(2,1) G(2,2) G(2,4) G(2,8) G(2,16) \
112 G(3,1) G(3,2) G(3,4) G(3,8) G(3,16) \
113 G(4,1) G(4,2) G(4,4) G(4,8) G(4,16) \
114 G(8,1) G(8,2) G(8,4) G(8,8) G(8,16) \
115 G(10,1) G(10,2) G(10,4) G(10,8) G(10,16) \
116 G(16,1) G(16,2) G(16,4) G(16,8) G(16,16)
117 #define
SPECIFICS_RR(G
) \
118 G(2,2) G(2,3) G(2,4) G(2,8) G(2,10) G(2,16) \
119 G(3,2) G(3,3) G(3,4) G(3,8) G(3,10) G(3,16) \
120 G(4,2) G(4,3) G(4,4) G(4,8) G(4,10) G(4,16) \
121 G(8,2) G(8,3) G(8,4) G(8,8) G(8,10) G(8,16) \
122 G(10,2) G(10,3) G(10,4) G(10,8) G(10,10) G(10,16) \
123 G(16,2) G(16,3) G(16,4) G(16,8) G(16,10) G(16,16)
125 ! Set PRIVATE accessibility for specifics with 1 or 2 INTEGER, LOGICAL, or REAL
126 ! arguments for generic G.
127 #define
PRIVATE_I(G
) private
:: \
128 G##_i1
, G##_i2
, G##_i4
, G##_i8
, G##_i16
129 #define
PRIVATE_L(G
) private
:: \
130 G##_l1
, G##_l2
, G##_l4
, G##_l8
131 #define
PRIVATE_R(G
) private
:: \
132 G##_a2
, G##_a3
, G##_a4
, G##_a8
, G##_a10
, G##_a16
133 #define
PRIVATE_II(G
) private
:: \
134 G##_i1_i1
, G##_i1_i2
, G##_i1_i4
, G##_i1_i8
, G##_i1_i16
, \
135 G##_i2_i1
, G##_i2_i2
, G##_i2_i4
, G##_i2_i8
, G##_i2_i16
, \
136 G##_i4_i1
, G##_i4_i2
, G##_i4_i4
, G##_i4_i8
, G##_i4_i16
, \
137 G##_i8_i1
, G##_i8_i2
, G##_i8_i4
, G##_i8_i8
, G##_i8_i16
, \
138 G##_i16_i1
, G##_i16_i2
, G##_i16_i4
, G##_i16_i8
, G##_i16_i16
139 #define
PRIVATE_RI(G
) private
:: \
140 G##_a2_i1
, G##_a2_i2
, G##_a2_i4
, G##_a2_i8
, G##_a2_i16
, \
141 G##_a3_i1
, G##_a3_i2
, G##_a3_i4
, G##_a3_i8
, G##_a3_i16
, \
142 G##_a4_i1
, G##_a4_i2
, G##_a4_i4
, G##_a4_i8
, G##_a4_i16
, \
143 G##_a8_i1
, G##_a8_i2
, G##_a8_i4
, G##_a8_i8
, G##_a8_i16
, \
144 G##_a10_i1
, G##_a10_i2
, G##_a10_i4
, G##_a10_i8
, G##_a10_i16
, \
145 G##_a16_i1
, G##_a16_i2
, G##_a16_i4
, G##_a16_i8
, G##_a16_i16
146 #define
PRIVATE_RR(G
) private
:: \
147 G##_a2_a2
, G##_a2_a3
, G##_a2_a4
, G##_a2_a8
, G##_a2_a10
, G##_a2_a16
, \
148 G##_a3_a2
, G##_a3_a3
, G##_a3_a4
, G##_a3_a8
, G##_a3_a10
, G##_a3_a16
, \
149 G##_a4_a2
, G##_a4_a3
, G##_a4_a4
, G##_a4_a8
, G##_a4_a10
, G##_a4_a16
, \
150 G##_a8_a2
, G##_a8_a3
, G##_a8_a4
, G##_a8_a8
, G##_a8_a10
, G##_a8_a16
, \
151 G##_a10_a2
, G##_a10_a3
, G##_a10_a4
, G##_a10_a8
, G##_a10_a10
, G##_a10_a16
, \
152 G##_a16_a2
, G##_a16_a3
, G##_a16_a4
, G##_a16_a8
, G##_a16_a10
, G##_a16_a16
154 #define
IEEE_CLASS_R(XKIND
) \
155 elemental
type(ieee_class_type
) function ieee_class_a##
XKIND(x
); \
156 import ieee_class_type
; \
157 real(XKIND
), intent(in
) :: x
; \
158 end function ieee_class_a##XKIND
;
160 SPECIFICS_R(IEEE_CLASS_R
)
161 end interface ieee_class
162 PRIVATE_R(IEEE_CLASS
)
165 #define
IEEE_COPY_SIGN_RR(XKIND
, YKIND
) \
166 elemental
real(XKIND
) function ieee_copy_sign_a##XKIND##_a##
YKIND(x
, y
); \
167 real(XKIND
), intent(in
) :: x
; \
168 real(YKIND
), intent(in
) :: y
; \
169 end function ieee_copy_sign_a##XKIND##_a##YKIND
;
170 interface ieee_copy_sign
171 SPECIFICS_RR(IEEE_COPY_SIGN_RR
)
172 end interface ieee_copy_sign
173 PRIVATE_RR(IEEE_COPY_SIGN
)
174 #undef IEEE_COPY_SIGN_RR
176 #define
IEEE_FMA_R(AKIND
) \
177 elemental
real(AKIND
) function ieee_fma_a##
AKIND(a
, b
, c
); \
178 real(AKIND
), intent(in
) :: a
, b
, c
; \
179 end function ieee_fma_a##AKIND
;
181 SPECIFICS_R(IEEE_FMA_R
)
182 end interface ieee_fma
186 #define
IEEE_GET_ROUNDING_MODE_I(RKIND
) \
187 subroutine ieee_get_rounding_mode_i##
RKIND(round_value
, radix
); \
188 import ieee_round_type
; \
189 type(ieee_round_type
), intent(out
) :: round_value
; \
190 integer(RKIND
), intent(in
) :: radix
; \
191 end subroutine ieee_get_rounding_mode_i##RKIND
;
192 interface ieee_get_rounding_mode
193 subroutine ieee_get_rounding_mode(round_value
)
194 import ieee_round_type
195 type(ieee_round_type
), intent(out
) :: round_value
196 end subroutine ieee_get_rounding_mode
197 SPECIFICS_I(IEEE_GET_ROUNDING_MODE_I
)
198 end interface ieee_get_rounding_mode
199 PRIVATE_I(IEEE_GET_ROUNDING_MODE
)
200 #undef IEEE_GET_ROUNDING_MODE_I
202 #define
IEEE_GET_UNDERFLOW_MODE_L(GKIND
) \
203 subroutine ieee_get_underflow_mode_l##
GKIND(gradual
); \
204 logical(GKIND
), intent(out
) :: gradual
; \
205 end subroutine ieee_get_underflow_mode_l##GKIND
;
206 interface ieee_get_underflow_mode
207 SPECIFICS_L(IEEE_GET_UNDERFLOW_MODE_L
)
208 end interface ieee_get_underflow_mode
209 PRIVATE_L(IEEE_GET_UNDERFLOW_MODE
)
210 #undef IEEE_GET_UNDERFLOW_MODE_L
212 ! When kind argument is present, kind(result) is value(kind), not kind(kind).
213 ! That is not known here, so return integer(16).
214 #define
IEEE_INT_R(AKIND
) \
215 elemental
integer function ieee_int_a##
AKIND(a
, round
); \
216 import ieee_round_type
; \
217 real(AKIND
), intent(in
) :: a
; \
218 type(ieee_round_type
), intent(in
) :: round
; \
219 end function ieee_int_a##AKIND
;
220 #define
IEEE_INT_RI(AKIND
, KKIND
) \
221 elemental
integer(16) function ieee_int_a##AKIND##_i##
KKIND(a
, round
, kind
); \
222 import ieee_round_type
; \
223 real(AKIND
), intent(in
) :: a
; \
224 type(ieee_round_type
), intent(in
) :: round
; \
225 integer(KKIND
), intent(in
) :: kind
; \
226 end function ieee_int_a##AKIND##_i##KKIND
;
228 SPECIFICS_R(IEEE_INT_R
)
229 SPECIFICS_RI(IEEE_INT_RI
)
230 end interface ieee_int
236 #define
IEEE_IS_FINITE_R(XKIND
) \
237 elemental
logical function ieee_is_finite_a##
XKIND(x
); \
238 real(XKIND
), intent(in
) :: x
; \
239 end function ieee_is_finite_a##XKIND
;
240 interface ieee_is_finite
241 SPECIFICS_R(IEEE_IS_FINITE_R
)
242 end interface ieee_is_finite
243 PRIVATE_R(IEEE_IS_FINITE
)
244 #undef IEEE_IS_FINITE_R
246 #define
IEEE_LOGB_R(XKIND
) \
247 elemental
real(XKIND
) function ieee_logb_a##
XKIND(x
); \
248 real(XKIND
), intent(in
) :: x
; \
249 end function ieee_logb_a##XKIND
;
251 SPECIFICS_R(IEEE_LOGB_R
)
252 end interface ieee_logb
256 #define
IEEE_MAX_NUM_R(XKIND
) \
257 elemental
real(XKIND
) function ieee_max_num_a##
XKIND(x
, y
); \
258 real(XKIND
), intent(in
) :: x
, y
; \
259 end function ieee_max_num_a##XKIND
;
260 interface ieee_max_num
261 SPECIFICS_R(IEEE_MAX_NUM_R
)
262 end interface ieee_max_num
263 PRIVATE_R(IEEE_MAX_NUM
)
264 #undef IEEE_MAX_NUM_R
266 #define
IEEE_MAX_NUM_MAG_R(XKIND
) \
267 elemental
real(XKIND
) function ieee_max_num_mag_a##
XKIND(x
, y
); \
268 real(XKIND
), intent(in
) :: x
, y
; \
269 end function ieee_max_num_mag_a##XKIND
;
270 interface ieee_max_num_mag
271 SPECIFICS_R(IEEE_MAX_NUM_MAG_R
)
272 end interface ieee_max_num_mag
273 PRIVATE_R(IEEE_MAX_NUM_MAG
)
274 #undef IEEE_MAX_NUM_MAG_R
276 #define
IEEE_MIN_NUM_R(XKIND
) \
277 elemental
real(XKIND
) function ieee_min_num_a##
XKIND(x
, y
); \
278 real(XKIND
), intent(in
) :: x
, y
; \
279 end function ieee_min_num_a##XKIND
;
280 interface ieee_min_num
281 SPECIFICS_R(IEEE_MIN_NUM_R
)
282 end interface ieee_min_num
283 PRIVATE_R(IEEE_MIN_NUM
)
284 #undef IEEE_MIN_NUM_R
286 #define
IEEE_MIN_NUM_MAG_R(XKIND
) \
287 elemental
real(XKIND
) function ieee_min_num_mag_a##
XKIND(x
, y
); \
288 real(XKIND
), intent(in
) :: x
, y
; \
289 end function ieee_min_num_mag_a##XKIND
;
290 interface ieee_min_num_mag
291 SPECIFICS_R(IEEE_MIN_NUM_MAG_R
)
292 end interface ieee_min_num_mag
293 PRIVATE_R(IEEE_MIN_NUM_MAG
)
294 #undef IEEE_MIN_NUM_MAG_R
296 #define
IEEE_QUIET_EQ_R(AKIND
) \
297 elemental
logical function ieee_quiet_eq_a##
AKIND(a
, b
); \
298 real(AKIND
), intent(in
) :: a
, b
; \
299 end function ieee_quiet_eq_a##AKIND
;
300 interface ieee_quiet_eq
301 SPECIFICS_R(IEEE_QUIET_EQ_R
)
302 end interface ieee_quiet_eq
303 PRIVATE_R(IEEE_QUIET_EQ
)
304 #undef IEEE_QUIET_EQ_R
306 #define
IEEE_QUIET_GE_R(AKIND
) \
307 elemental
logical function ieee_quiet_ge_a##
AKIND(a
, b
); \
308 real(AKIND
), intent(in
) :: a
, b
; \
309 end function ieee_quiet_ge_a##AKIND
;
310 interface ieee_quiet_ge
311 SPECIFICS_R(IEEE_QUIET_GE_R
)
312 end interface ieee_quiet_ge
313 PRIVATE_R(IEEE_QUIET_GE
)
314 #undef IEEE_QUIET_GE_R
316 #define
IEEE_QUIET_GT_R(AKIND
) \
317 elemental
logical function ieee_quiet_gt_a##
AKIND(a
, b
); \
318 real(AKIND
), intent(in
) :: a
, b
; \
319 end function ieee_quiet_gt_a##AKIND
;
320 interface ieee_quiet_gt
321 SPECIFICS_R(IEEE_QUIET_GT_R
)
322 end interface ieee_quiet_gt
323 PRIVATE_R(IEEE_QUIET_GT
)
324 #undef IEEE_QUIET_GT_R
326 #define
IEEE_QUIET_LE_R(AKIND
) \
327 elemental
logical function ieee_quiet_le_a##
AKIND(a
, b
); \
328 real(AKIND
), intent(in
) :: a
, b
; \
329 end function ieee_quiet_le_a##AKIND
;
330 interface ieee_quiet_le
331 SPECIFICS_R(IEEE_QUIET_LE_R
)
332 end interface ieee_quiet_le
333 PRIVATE_R(IEEE_QUIET_LE
)
334 #undef IEEE_QUIET_LE_R
336 #define
IEEE_QUIET_LT_R(AKIND
) \
337 elemental
logical function ieee_quiet_lt_a##
AKIND(a
, b
); \
338 real(AKIND
), intent(in
) :: a
, b
; \
339 end function ieee_quiet_lt_a##AKIND
;
340 interface ieee_quiet_lt
341 SPECIFICS_R(IEEE_QUIET_LT_R
)
342 end interface ieee_quiet_lt
343 PRIVATE_R(IEEE_QUIET_LT
)
344 #undef IEEE_QUIET_LT_R
346 #define
IEEE_QUIET_NE_R(AKIND
) \
347 elemental
logical function ieee_quiet_ne_a##
AKIND(a
, b
); \
348 real(AKIND
), intent(in
) :: a
, b
; \
349 end function ieee_quiet_ne_a##AKIND
;
350 interface ieee_quiet_ne
351 SPECIFICS_R(IEEE_QUIET_NE_R
)
352 end interface ieee_quiet_ne
353 PRIVATE_R(IEEE_QUIET_NE
)
354 #undef IEEE_QUIET_NE_R
356 ! When kind argument is present, kind(result) is value(kind), not kind(kind).
357 ! That is not known here, so return real(16).
358 #define
IEEE_REAL_I(AKIND
) \
359 elemental
real function ieee_real_i##
AKIND(a
); \
360 integer(AKIND
), intent(in
) :: a
; \
361 end function ieee_real_i##AKIND
;
362 #define
IEEE_REAL_R(AKIND
) \
363 elemental
real function ieee_real_a##
AKIND(a
); \
364 real(AKIND
), intent(in
) :: a
; \
365 end function ieee_real_a##AKIND
;
366 #define
IEEE_REAL_II(AKIND
, KKIND
) \
367 elemental
real(16) function ieee_real_i##AKIND##_i##
KKIND(a
, kind
); \
368 integer(AKIND
), intent(in
) :: a
; \
369 integer(KKIND
), intent(in
) :: kind
; \
370 end function ieee_real_i##AKIND##_i##KKIND
;
371 #define
IEEE_REAL_RI(AKIND
, KKIND
) \
372 elemental
real(16) function ieee_real_a##AKIND##_i##
KKIND(a
, kind
); \
373 real(AKIND
), intent(in
) :: a
; \
374 integer(KKIND
), intent(in
) :: kind
; \
375 end function ieee_real_a##AKIND##_i##KKIND
;
377 SPECIFICS_I(IEEE_REAL_I
)
378 SPECIFICS_R(IEEE_REAL_R
)
379 SPECIFICS_II(IEEE_REAL_II
)
380 SPECIFICS_RI(IEEE_REAL_RI
)
381 end interface ieee_real
384 PRIVATE_II(IEEE_REAL
)
385 PRIVATE_RI(IEEE_REAL
)
391 #define
IEEE_REM_RR(XKIND
, YKIND
) \
392 elemental
real(XKIND
) function ieee_rem_a##XKIND##_a##
YKIND(x
, y
); \
393 real(XKIND
), intent(in
) :: x
; \
394 real(YKIND
), intent(in
) :: y
; \
395 end function ieee_rem_a##XKIND##_a##YKIND
;
397 SPECIFICS_RR(IEEE_REM_RR
)
398 end interface ieee_rem
402 #define
IEEE_RINT_R(XKIND
) \
403 elemental
real(XKIND
) function ieee_rint_a##
XKIND(x
, round
); \
404 import ieee_round_type
; \
405 real(XKIND
), intent(in
) :: x
; \
406 type(ieee_round_type
), optional
, intent(in
) :: round
; \
407 end function ieee_rint_a##XKIND
;
409 SPECIFICS_R(IEEE_RINT_R
)
410 end interface ieee_rint
414 #define
IEEE_SET_ROUNDING_MODE_I(RKIND
) \
415 subroutine ieee_set_rounding_mode_i##
RKIND(round_value
, radix
); \
416 import ieee_round_type
; \
417 type(ieee_round_type
), intent(in
) :: round_value
; \
418 integer(RKIND
), intent(in
) :: radix
; \
419 end subroutine ieee_set_rounding_mode_i##RKIND
;
420 interface ieee_set_rounding_mode
421 subroutine ieee_set_rounding_mode(round_value
)
422 import ieee_round_type
423 type(ieee_round_type
), intent(in
) :: round_value
424 end subroutine ieee_set_rounding_mode
425 SPECIFICS_I(IEEE_SET_ROUNDING_MODE_I
)
426 end interface ieee_set_rounding_mode
427 PRIVATE_I(IEEE_SET_ROUNDING_MODE
)
428 #undef IEEE_SET_ROUNDING_MODE_I
430 #define
IEEE_SET_UNDERFLOW_MODE_L(GKIND
) \
431 subroutine ieee_set_underflow_mode_l##
GKIND(gradual
); \
432 logical(GKIND
), intent(in
) :: gradual
; \
433 end subroutine ieee_set_underflow_mode_l##GKIND
;
434 interface ieee_set_underflow_mode
435 SPECIFICS_L(IEEE_SET_UNDERFLOW_MODE_L
)
436 end interface ieee_set_underflow_mode
437 PRIVATE_L(IEEE_SET_UNDERFLOW_MODE
)
438 #undef IEEE_SET_UNDERFLOW_MODE_L
440 #define
IEEE_SIGNALING_EQ_R(AKIND
) \
441 elemental
logical function ieee_signaling_eq_a##
AKIND(a
, b
); \
442 real(AKIND
), intent(in
) :: a
, b
; \
443 end function ieee_signaling_eq_a##AKIND
;
444 interface ieee_signaling_eq
445 SPECIFICS_R(IEEE_SIGNALING_EQ_R
)
446 end interface ieee_signaling_eq
447 PRIVATE_R(IEEE_SIGNALING_EQ
)
448 #undef IEEE_SIGNALING_EQ_R
450 #define
IEEE_SIGNALING_GE_R(AKIND
) \
451 elemental
logical function ieee_signaling_ge_a##
AKIND(a
, b
); \
452 real(AKIND
), intent(in
) :: a
, b
; \
453 end function ieee_signaling_ge_a##AKIND
;
454 interface ieee_signaling_ge
455 SPECIFICS_R(IEEE_SIGNALING_GE_R
)
456 end interface ieee_signaling_ge
457 PRIVATE_R(IEEE_SIGNALING_GE
)
458 #undef IEEE_SIGNALING_GE_R
460 #define
IEEE_SIGNALING_GT_R(AKIND
) \
461 elemental
logical function ieee_signaling_gt_a##
AKIND(a
, b
); \
462 real(AKIND
), intent(in
) :: a
, b
; \
463 end function ieee_signaling_gt_a##AKIND
;
464 interface ieee_signaling_gt
465 SPECIFICS_R(IEEE_SIGNALING_GT_R
)
466 end interface ieee_signaling_gt
467 PRIVATE_R(IEEE_SIGNALING_GT
)
468 #undef IEEE_SIGNALING_GT_R
470 #define
IEEE_SIGNALING_LE_R(AKIND
) \
471 elemental
logical function ieee_signaling_le_a##
AKIND(a
, b
); \
472 real(AKIND
), intent(in
) :: a
, b
; \
473 end function ieee_signaling_le_a##AKIND
;
474 interface ieee_signaling_le
475 SPECIFICS_R(IEEE_SIGNALING_LE_R
)
476 end interface ieee_signaling_le
477 PRIVATE_R(IEEE_SIGNALING_LE
)
478 #undef IEEE_SIGNALING_LE_R
480 #define
IEEE_SIGNALING_LT_R(AKIND
) \
481 elemental
logical function ieee_signaling_lt_a##
AKIND(a
, b
); \
482 real(AKIND
), intent(in
) :: a
, b
; \
483 end function ieee_signaling_lt_a##AKIND
;
484 interface ieee_signaling_lt
485 SPECIFICS_R(IEEE_SIGNALING_LT_R
)
486 end interface ieee_signaling_lt
487 PRIVATE_R(IEEE_SIGNALING_LT
)
488 #undef IEEE_SIGNALING_LT_R
490 #define
IEEE_SIGNALING_NE_R(AKIND
) \
491 elemental
logical function ieee_signaling_ne_a##
AKIND(a
, b
); \
492 real(AKIND
), intent(in
) :: a
, b
; \
493 end function ieee_signaling_ne_a##AKIND
;
494 interface ieee_signaling_ne
495 SPECIFICS_R(IEEE_SIGNALING_NE_R
)
496 end interface ieee_signaling_ne
497 PRIVATE_R(IEEE_SIGNALING_NE
)
498 #undef IEEE_SIGNALING_NE_R
500 #define
IEEE_SIGNBIT_R(XKIND
) \
501 elemental
logical function ieee_signbit_a##
XKIND(x
); \
502 real(XKIND
), intent(in
) :: x
; \
503 end function ieee_signbit_a##XKIND
;
504 interface ieee_signbit
505 SPECIFICS_R(IEEE_SIGNBIT_R
)
506 end interface ieee_signbit
507 PRIVATE_R(IEEE_SIGNBIT
)
508 #undef IEEE_SIGNBIT_R
510 #define
IEEE_SUPPORT_ROUNDING_R(XKIND
) \
511 pure
logical function ieee_support_rounding_a##
XKIND(round_value
, x
); \
512 import ieee_round_type
; \
513 type(ieee_round_type
), intent(in
) :: round_value
; \
514 real(XKIND
), intent(in
) :: x(..); \
515 end function ieee_support_rounding_a##XKIND
;
516 interface ieee_support_rounding
517 pure
logical function ieee_support_rounding(round_value
)
518 import ieee_round_type
519 type(ieee_round_type
), intent(in
) :: round_value
520 end function ieee_support_rounding
521 SPECIFICS_R(IEEE_SUPPORT_ROUNDING_R
)
522 end interface ieee_support_rounding
523 PRIVATE_R(IEEE_SUPPORT_ROUNDING
)
524 #undef IEEE_SUPPORT_ROUNDING_R
526 #define
IEEE_UNORDERED_RR(XKIND
, YKIND
) \
527 elemental
logical function ieee_unordered_a##XKIND##_a##
YKIND(x
, y
); \
528 real(XKIND
), intent(in
) :: x
; \
529 real(YKIND
), intent(in
) :: y
; \
530 end function ieee_unordered_a##XKIND##_a##YKIND
;
531 interface ieee_unordered
532 SPECIFICS_RR(IEEE_UNORDERED_RR
)
533 end interface ieee_unordered
534 PRIVATE_RR(IEEE_UNORDERED
)
535 #undef IEEE_UNORDERED_RR
537 #define
IEEE_VALUE_R(XKIND
) \
538 elemental
real(XKIND
) function ieee_value_a##
XKIND(x
, class
); \
539 import ieee_class_type
; \
540 real(XKIND
), intent(in
) :: x
; \
541 type(ieee_class_type
), intent(in
) :: class
; \
542 end function ieee_value_a##XKIND
;
544 SPECIFICS_R(IEEE_VALUE_R
)
545 end interface ieee_value
546 PRIVATE_R(IEEE_VALUE
)
549 end module ieee_arithmetic