NCEPLIBS-g2  3.4.7
mkieee.F90
Go to the documentation of this file.
1 
4 
13 subroutine mkieee(a, rieee, num)
14  implicit none
15 
16  real(4), intent(in) :: a(num)
17  real(4), intent(out) :: rieee(num)
18  integer, intent(in) :: num
19 
20  integer(4) :: ieee
21  real, parameter :: two23 = scale(1.0,23)
22  real, parameter :: two126 = scale(1.0,126)
23  real :: alog2, atemp
24  integer :: iexp, imant, j, n
25 
26  alog2 = alog(2.0)
27 
28  do j = 1, num
29  ieee = 0
30  if (a(j) .eq. 0.) then
31  ieee = 0
32  rieee(j) = transfer(ieee, rieee(j))
33  cycle
34  endif
35 
36  ! Set Sign bit (bit 31 - leftmost bit).
37  if (a(j) .lt. 0.0) then
38  ieee = ibset(ieee, 31)
39  atemp = abs(a(j))
40  else
41  ieee = ibclr(ieee, 31)
42  atemp = a(j)
43  endif
44 
45  ! Determine exponent n with base 2.
46  if (atemp .ge. 1.0) then
47  n = 0
48  do while (2.0**(n+1) .le. atemp)
49  n = n + 1
50  enddo
51  else
52  n = -1
53  do while (2.0**n .gt. atemp )
54  n = n - 1
55  enddo
56  endif
57  iexp = n + 127
58  if (n .gt. 127) iexp = 255 ! overflow
59  if (n .lt. -127) iexp = 0
60  call mvbits(iexp, 0, 8, ieee, 23)
61 
62  ! Determine Mantissa.
63  if (iexp .ne. 255) then
64  if (iexp .ne. 0) then
65  atemp = (atemp / (2.0**n)) - 1.0
66  else
67  atemp = atemp * two126
68  endif
69  imant = nint(atemp * two23)
70  else
71  imant = 0
72  endif
73  ! set mantissa bits (bits 22-0).
74  call mvbits(imant, 0, 23, ieee, 0)
75 
76  ! Transfer IEEE bit string to real variable.
77  rieee(j) = transfer(ieee, rieee(j))
78  enddo
79 end subroutine mkieee
80 
subroutine mkieee(a, rieee, num)
Copy an array of real to an array of 32-bit IEEE floating points.
Definition: mkieee.F90:14