| ! Test IEEE_FMA |
| ! { dg-do run } |
| |
| use, intrinsic :: ieee_features |
| use, intrinsic :: ieee_exceptions |
| use, intrinsic :: ieee_arithmetic |
| implicit none |
| |
| integer :: ex |
| |
| real :: sx1, sx2, sx3 |
| double precision :: dx1, dx2, dx3 |
| |
| ! k1 and k2 will be large real kinds, if supported, and single/double |
| ! otherwise |
| integer, parameter :: k1 = & |
| max(ieee_selected_real_kind(precision(0.d0) + 1), kind(0.)) |
| integer, parameter :: k2 = & |
| max(ieee_selected_real_kind(precision(0._k1) + 1), kind(0.d0)) |
| |
| real(kind=k1) :: lx1, lx2, lx3 |
| real(kind=k2) :: wx1, wx2, wx3 |
| |
| ! Float |
| |
| sx1 = 3 ; sx2 = 2 ; sx3 = 1 |
| if (ieee_fma(sx1, sx2, sx3) /= 7) stop 1 |
| sx1 = 0 ; sx2 = 2 ; sx3 = 1 |
| if (ieee_fma(sx1, sx2, sx3) /= 1) stop 2 |
| sx1 = 3 ; sx2 = 2 ; sx3 = 0 |
| if (ieee_fma(sx1, sx2, sx3) /= 6) stop 3 |
| |
| ex = int(log(rrspacing(real(1, kind(sx1)))) / log(real(2, kind(sx1)))) - 1 |
| sx1 = 1 + spacing(real(1, kind(sx1))) |
| sx2 = 2 ; sx2 = sx2 ** ex ; sx2 = sx2 * 3 |
| sx3 = -sx2 |
| |
| print *, sx1 * sx2 + sx3 |
| print *, ieee_fma(sx1, sx2, sx3) |
| if (ieee_fma(sx1, sx2, sx3) /= real(3, kind(sx1)) / 2) stop 4 |
| |
| ! Double |
| |
| dx1 = 3 ; dx2 = 2 ; dx3 = 1 |
| if (ieee_fma(dx1, dx2, dx3) /= 7) stop 1 |
| dx1 = 0 ; dx2 = 2 ; dx3 = 1 |
| if (ieee_fma(dx1, dx2, dx3) /= 1) stop 2 |
| dx1 = 3 ; dx2 = 2 ; dx3 = 0 |
| if (ieee_fma(dx1, dx2, dx3) /= 6) stop 3 |
| |
| ex = int(log(rrspacing(real(1, kind(dx1)))) / log(real(2, kind(dx1)))) - 1 |
| dx1 = 1 + spacing(real(1, kind(dx1))) |
| dx2 = 2 ; dx2 = dx2 ** ex ; dx2 = dx2 * 3 |
| dx3 = -dx2 |
| |
| print *, dx1 * dx2 + dx3 |
| print *, ieee_fma(dx1, dx2, dx3) |
| if (ieee_fma(dx1, dx2, dx3) /= real(3, kind(dx1)) / 2) stop 4 |
| |
| ! Large kind 1 |
| |
| lx1 = 3 ; lx2 = 2 ; lx3 = 1 |
| if (ieee_fma(lx1, lx2, lx3) /= 7) stop 1 |
| lx1 = 0 ; lx2 = 2 ; lx3 = 1 |
| if (ieee_fma(lx1, lx2, lx3) /= 1) stop 2 |
| lx1 = 3 ; lx2 = 2 ; lx3 = 0 |
| if (ieee_fma(lx1, lx2, lx3) /= 6) stop 3 |
| |
| ex = int(log(rrspacing(real(1, kind(lx1)))) / log(real(2, kind(lx1)))) - 1 |
| lx1 = 1 + spacing(real(1, kind(lx1))) |
| lx2 = 2 ; lx2 = lx2 ** ex ; lx2 = lx2 * 3 |
| lx3 = -lx2 |
| |
| print *, lx1 * lx2 + lx3 |
| print *, ieee_fma(lx1, lx2, lx3) |
| if (ieee_fma(lx1, lx2, lx3) /= real(3, kind(lx1)) / 2) stop 4 |
| |
| ! Large kind 2 |
| |
| wx1 = 3 ; wx2 = 2 ; wx3 = 1 |
| if (ieee_fma(wx1, wx2, wx3) /= 7) stop 1 |
| wx1 = 0 ; wx2 = 2 ; wx3 = 1 |
| if (ieee_fma(wx1, wx2, wx3) /= 1) stop 2 |
| wx1 = 3 ; wx2 = 2 ; wx3 = 0 |
| if (ieee_fma(wx1, wx2, wx3) /= 6) stop 3 |
| |
| ex = int(log(rrspacing(real(1, kind(wx1)))) / log(real(2, kind(wx1)))) - 1 |
| wx1 = 1 + spacing(real(1, kind(wx1))) |
| wx2 = 2 ; wx2 = wx2 ** ex ; wx2 = wx2 * 3 |
| wx3 = -wx2 |
| |
| print *, wx1 * wx2 + wx3 |
| print *, ieee_fma(wx1, wx2, wx3) |
| if (ieee_fma(wx1, wx2, wx3) /= real(3, kind(wx1)) / 2) stop 4 |
| |
| end |