1 ! Test if MIN and MAX intrinsics behave correctly when passed NaNs
5 ! { dg-add-options ieee }
9 module procedure isnan_r
10 module procedure isnan_d
14 module procedure isinf_r
15 module procedure isinf_d
19 pure
function isnan_r(x
) result (isnan
)
23 isnan
= (.not
.(x
== x
))
26 pure
function isnan_d(x
) result (isnan
)
28 double precision, intent(in
) :: x
30 isnan
= (.not
.(x
== x
))
33 pure
function isinf_r(x
) result (isinf
)
37 isinf
= (x
> huge(x
)) .or
. (x
< -huge(x
))
40 pure
function isinf_d(x
) result (isinf
)
42 double precision, intent(in
) :: x
44 isinf
= (x
> huge(x
)) .or
. (x
< -huge(x
))
51 real :: nan
, large
, inf
53 ! Create a NaN and check it
56 if (nan
== nan
.or
. nan
> nan
.or
. nan
< nan
.or
. nan
>= nan
&
57 .or
. nan
<= nan
) STOP 1
58 if (isnan (2.d0
) .or
. (.not
. isnan(nan
)) .or
. &
59 (.not
. isnan(real(nan
,kind
=kind(2.d0
))))) STOP 2
61 ! Create an INF and check it
64 if (isinf(nan
) .or
. isinf(large
) .or
. .not
. isinf(inf
)) STOP 3
65 if (isinf(-nan
) .or
. isinf(-large
) .or
. .not
. isinf(-inf
)) STOP 4
67 ! Check that MIN and MAX behave correctly
69 if (.not
. isnan(min(nan
,nan
))) STOP 13
70 if (.not
. isnan(max(nan
,nan
))) STOP 14
72 ! Same thing, with more arguments
74 if (.not
. isnan(min(nan
,nan
,nan
))) STOP 27
75 if (.not
. isnan(max(nan
,nan
,nan
))) STOP 28
76 if (.not
. isnan(min(nan
,nan
,nan
,nan
))) STOP 29
77 if (.not
. isnan(max(nan
,nan
,nan
,nan
))) STOP 30
78 if (.not
. isnan(min(nan
,nan
,nan
,nan
,nan
))) STOP 31
79 if (.not
. isnan(max(nan
,nan
,nan
,nan
,nan
))) STOP 32
81 ! Large values, INF and NaNs
82 if (.not
. isinf(max(large
, inf
))) STOP 33
83 if (isinf(min(large
, inf
))) STOP 34
85 if (.not
. isinf(min(-large
, -inf
))) STOP 41
86 if (isinf(max(-large
, -inf
))) STOP 42