blob: 68ec9301dfb0e605ac0e814d195bdafef36a693a [file] [log] [blame]
! { dg-do run }
! { dg-add-options ieee }
!
! PR fortran/34209
!
! Test run-time implementation of NEAREST
!
program test
implicit none
real(4), volatile :: r4
real(8), volatile :: r8
! Single precision with single-precision sign
r4 = 0.0_4
! 0+ > 0
if (nearest(r4, 1.0) &
<= r4) &
STOP 1
! 0++ > 0+
if (nearest(nearest(r4, 1.0), 1.0) &
<= nearest(r4, 1.0)) &
STOP 2
! 0+++ > 0++
if (nearest(nearest(nearest(r4, 1.0), 1.0), 1.0) &
<= nearest(nearest(r4, 1.0), 1.0)) &
STOP 3
! 0+- = 0
if (nearest(nearest(r4, 1.0), -1.0) &
/= r4) &
STOP 4
! 0++- = 0+
if (nearest(nearest(nearest(r4, 1.0), 1.0), -1.0) &
/= nearest(r4, 1.0)) &
STOP 5
! 0++-- = 0
if (nearest(nearest(nearest(nearest(r4, 1.0), 1.0), -1.0), -1.0) &
/= r4) &
STOP 6
! 0- < 0
if (nearest(r4, -1.0) &
>= r4) &
STOP 7
! 0-- < 0+
if (nearest(nearest(r4, -1.0), -1.0) &
>= nearest(r4, -1.0)) &
STOP 8
! 0--- < 0--
if (nearest(nearest(nearest(r4, -1.0), -1.0), -1.0) &
>= nearest(nearest(r4, -1.0), -1.0)) &
STOP 9
! 0-+ = 0
if (nearest(nearest(r4, -1.0), 1.0) &
/= r4) &
STOP 10
! 0--+ = 0-
if (nearest(nearest(nearest(r4, -1.0), -1.0), 1.0) &
/= nearest(r4, -1.0)) &
STOP 11
! 0--++ = 0
if (nearest(nearest(nearest(nearest(r4, -1.0), -1.0), 1.0), 1.0) &
/= r4) &
STOP 12
r4 = 42.0_4
! 42++ > 42+
if (nearest(nearest(r4, 1.0), 1.0) &
<= nearest(r4, 1.0)) &
STOP 13
! 42-- < 42-
if (nearest(nearest(r4, -1.0), -1.0) &
>= nearest(r4, -1.0)) &
STOP 14
! 42-+ = 42
if (nearest(nearest(r4, -1.0), 1.0) &
/= r4) &
STOP 15
! 42+- = 42
if (nearest(nearest(r4, 1.0), -1.0) &
/= r4) &
STOP 16
r4 = 0.0
! INF+ = INF
if (nearest(1.0/r4, 1.0) /= 1.0/r4) STOP 17
! -INF- = -INF
if (nearest(-1.0/r4, -1.0) /= -1.0/r4) STOP 18
! NAN- = NAN
if (.not.isnan(nearest(0.0/r4, 1.0))) STOP 19
! NAN+ = NAN
if (.not.isnan(nearest(0.0/r4, -1.0))) STOP 20
! Double precision with single-precision sign
r8 = 0.0_8
! 0+ > 0
if (nearest(r8, 1.0) &
<= r8) &
STOP 21
! 0++ > 0+
if (nearest(nearest(r8, 1.0), 1.0) &
<= nearest(r8, 1.0)) &
STOP 22
! 0+++ > 0++
if (nearest(nearest(nearest(r8, 1.0), 1.0), 1.0) &
<= nearest(nearest(r8, 1.0), 1.0)) &
STOP 23
! 0+- = 0
if (nearest(nearest(r8, 1.0), -1.0) &
/= r8) &
STOP 24
! 0++- = 0+
if (nearest(nearest(nearest(r8, 1.0), 1.0), -1.0) &
/= nearest(r8, 1.0)) &
STOP 25
! 0++-- = 0
if (nearest(nearest(nearest(nearest(r8, 1.0), 1.0), -1.0), -1.0) &
/= r8) &
STOP 26
! 0- < 0
if (nearest(r8, -1.0) &
>= r8) &
STOP 27
! 0-- < 0+
if (nearest(nearest(r8, -1.0), -1.0) &
>= nearest(r8, -1.0)) &
STOP 28
! 0--- < 0--
if (nearest(nearest(nearest(r8, -1.0), -1.0), -1.0) &
>= nearest(nearest(r8, -1.0), -1.0)) &
STOP 29
! 0-+ = 0
if (nearest(nearest(r8, -1.0), 1.0) &
/= r8) &
STOP 30
! 0--+ = 0-
if (nearest(nearest(nearest(r8, -1.0), -1.0), 1.0) &
/= nearest(r8, -1.0)) &
STOP 31
! 0--++ = 0
if (nearest(nearest(nearest(nearest(r8, -1.0), -1.0), 1.0), 1.0) &
/= r8) &
STOP 32
r8 = 42.0_8
! 42++ > 42+
if (nearest(nearest(r8, 1.0), 1.0) &
<= nearest(r8, 1.0)) &
STOP 33
! 42-- < 42-
if (nearest(nearest(r8, -1.0), -1.0) &
>= nearest(r8, -1.0)) &
STOP 34
! 42-+ = 42
if (nearest(nearest(r8, -1.0), 1.0) &
/= r8) &
STOP 35
! 42+- = 42
if (nearest(nearest(r8, 1.0), -1.0) &
/= r8) &
STOP 36
r4 = 0.0
! INF+ = INF
if (nearest(1.0/r4, 1.0) /= 1.0/r4) STOP 37
! -INF- = -INF
if (nearest(-1.0/r4, -1.0) /= -1.0/r4) STOP 38
! NAN- = NAN
if (.not.isnan(nearest(0.0/r4, 1.0))) STOP 39
! NAN+ = NAN
if (.not.isnan(nearest(0.0/r4, -1.0))) STOP 40
! Single precision with double-precision sign
r4 = 0.0_4
! 0+ > 0
if (nearest(r4, 1.0d0) &
<= r4) &
STOP 41
! 0++ > 0+
if (nearest(nearest(r4, 1.0d0), 1.0d0) &
<= nearest(r4, 1.0d0)) &
STOP 42
! 0+++ > 0++
if (nearest(nearest(nearest(r4, 1.0d0), 1.0d0), 1.0d0) &
<= nearest(nearest(r4, 1.0d0), 1.0d0)) &
STOP 43
! 0+- = 0
if (nearest(nearest(r4, 1.0d0), -1.0d0) &
/= r4) &
STOP 44
! 0++- = 0+
if (nearest(nearest(nearest(r4, 1.0d0), 1.0d0), -1.0d0) &
/= nearest(r4, 1.0d0)) &
STOP 45
! 0++-- = 0
if (nearest(nearest(nearest(nearest(r4, 1.0d0), 1.0d0), -1.0d0), -1.0d0) &
/= r4) &
STOP 46
! 0- < 0
if (nearest(r4, -1.0d0) &
>= r4) &
STOP 47
! 0-- < 0+
if (nearest(nearest(r4, -1.0d0), -1.0d0) &
>= nearest(r4, -1.0d0)) &
STOP 48
! 0--- < 0--
if (nearest(nearest(nearest(r4, -1.0d0), -1.0d0), -1.0d0) &
>= nearest(nearest(r4, -1.0d0), -1.0d0)) &
STOP 49
! 0-+ = 0
if (nearest(nearest(r4, -1.0d0), 1.0d0) &
/= r4) &
STOP 50
! 0--+ = 0-
if (nearest(nearest(nearest(r4, -1.0d0), -1.0d0), 1.0d0) &
/= nearest(r4, -1.0d0)) &
STOP 51
! 0--++ = 0
if (nearest(nearest(nearest(nearest(r4, -1.0d0), -1.0d0), 1.0d0), 1.0d0) &
/= r4) &
STOP 52
r4 = 42.0_4
! 42++ > 42+
if (nearest(nearest(r4, 1.0d0), 1.0d0) &
<= nearest(r4, 1.0d0)) &
STOP 53
! 42-- < 42-
if (nearest(nearest(r4, -1.0d0), -1.0d0) &
>= nearest(r4, -1.0d0)) &
STOP 54
! 42-+ = 42
if (nearest(nearest(r4, -1.0d0), 1.0d0) &
/= r4) &
STOP 55
! 42+- = 42
if (nearest(nearest(r4, 1.0d0), -1.0d0) &
/= r4) &
STOP 56
r4 = 0.0
! INF+ = INF
if (nearest(1.0d0/r4, 1.0d0) /= 1.0d0/r4) STOP 57
! -INF- = -INF
if (nearest(-1.0d0/r4, -1.0d0) /= -1.0d0/r4) STOP 58
! NAN- = NAN
if (.not.isnan(nearest(0.0/r4, 1.0d0))) STOP 59
! NAN+ = NAN
if (.not.isnan(nearest(0.0/r4, -1.0d0))) STOP 60
! Double precision with double-precision sign
r8 = 0.0_8
! 0+ > 0
if (nearest(r8, 1.0d0) &
<= r8) &
STOP 61
! 0++ > 0+
if (nearest(nearest(r8, 1.0d0), 1.0d0) &
<= nearest(r8, 1.0d0)) &
STOP 62
! 0+++ > 0++
if (nearest(nearest(nearest(r8, 1.0d0), 1.0d0), 1.0d0) &
<= nearest(nearest(r8, 1.0d0), 1.0d0)) &
STOP 63
! 0+- = 0
if (nearest(nearest(r8, 1.0d0), -1.0d0) &
/= r8) &
STOP 64
! 0++- = 0+
if (nearest(nearest(nearest(r8, 1.0d0), 1.0d0), -1.0d0) &
/= nearest(r8, 1.0d0)) &
STOP 65
! 0++-- = 0
if (nearest(nearest(nearest(nearest(r8, 1.0d0), 1.0d0), -1.0d0), -1.0d0) &
/= r8) &
STOP 66
! 0- < 0
if (nearest(r8, -1.0d0) &
>= r8) &
STOP 67
! 0-- < 0+
if (nearest(nearest(r8, -1.0d0), -1.0d0) &
>= nearest(r8, -1.0d0)) &
STOP 68
! 0--- < 0--
if (nearest(nearest(nearest(r8, -1.0d0), -1.0d0), -1.0d0) &
>= nearest(nearest(r8, -1.0d0), -1.0d0)) &
STOP 69
! 0-+ = 0
if (nearest(nearest(r8, -1.0d0), 1.0d0) &
/= r8) &
STOP 70
! 0--+ = 0-
if (nearest(nearest(nearest(r8, -1.0d0), -1.0d0), 1.0d0) &
/= nearest(r8, -1.0d0)) &
STOP 71
! 0--++ = 0
if (nearest(nearest(nearest(nearest(r8, -1.0d0), -1.0d0), 1.0d0), 1.0d0) &
/= r8) &
STOP 72
r8 = 42.0_8
! 42++ > 42+
if (nearest(nearest(r8, 1.0d0), 1.0d0) &
<= nearest(r8, 1.0d0)) &
STOP 73
! 42-- < 42-
if (nearest(nearest(r8, -1.0d0), -1.0d0) &
>= nearest(r8, -1.0d0)) &
STOP 74
! 42-+ = 42
if (nearest(nearest(r8, -1.0d0), 1.0d0) &
/= r8) &
STOP 75
! 42+- = 42
if (nearest(nearest(r8, 1.0d0), -1.0d0) &
/= r8) &
STOP 76
r4 = 0.0
! INF+ = INF
if (nearest(1.0d0/r4, 1.0d0) /= 1.0d0/r4) STOP 77
! -INF- = -INF
if (nearest(-1.0d0/r4, -1.0d0) /= -1.0d0/r4) STOP 78
! NAN- = NAN
if (.not.isnan(nearest(0.0/r4, 1.0d0))) STOP 79
! NAN+ = NAN
if (.not.isnan(nearest(0.0/r4, -1.0d0))) STOP 80
end program test