logical function is_nan8(f)
  implicit none
  real(8), intent(in) :: f
  logical             :: is_nan
  integer (8) :: n
  integer :: i

  n = transfer(f, 0_8)

  ! Exponent part
  is_nan = .true.
  do i = 52, 62
    if( .not. btest(n,i) )then
      is_nan = .false.
      return
    endif
  enddo

  ! Fraction part
  is_nan = .false.
  do i = 0, 51
    if( btest(n,i) )then
      is_nan = .true.
      return
    endif
  enddo
end function is_nan8