NCEPLIBS-g2  3.4.5
mkieee.f
Go to the documentation of this file.
1 
5 
15 
16  subroutine mkieee(a,rieee,num)
17 
18  real(4),intent(in) :: a(num)
19  real(4),intent(out) :: rieee(num)
20  integer,intent(in) :: num
21 
22  integer(4) :: ieee
23 
24  real, parameter :: two23=scale(1.0,23)
25  real, parameter :: two126=scale(1.0,126)
26 
27  alog2=alog(2.0)
28 
29  do j=1,num
30  ieee=0
31 
32  if (a(j).eq.0.) then
33  ieee=0
34  rieee(j)=transfer(ieee,rieee(j))
35 ! write(6,fmt='(f20.10,5x,b32)') a,a
36 ! write(6,fmt='(f20.10,5x,b32)') rieee,rieee
37  cycle
38  endif
39 
40 !
41 ! Set Sign bit (bit 31 - leftmost bit)
42 !
43  if (a(j).lt.0.0) then
44  ieee=ibset(ieee,31)
45  atemp=abs(a(j))
46  else
47  ieee=ibclr(ieee,31)
48  atemp=a(j)
49  endif
50 !
51 ! Determine exponent n with base 2
52 !
53  if ( atemp .ge. 1.0 ) then
54  n = 0
55  do while ( 2.0**(n+1) .le. atemp )
56  n = n + 1
57  enddo
58  else
59  n = -1
60  do while ( 2.0**n .gt. atemp )
61  n = n - 1
62  enddo
63  endif
64 ! n=floor(alog(atemp)/alog2)
65  !write(6,*) ' logstuff ',alog(atemp)/alog2
66  !write(6,*) ' logstuffn ',n
67  iexp=n+127
68  if (n.gt.127) iexp=255 ! overflow
69  if (n.lt.-127) iexp=0
70  ! set exponent bits ( bits 30-23 )
71  call mvbits(iexp,0,8,ieee,23)
72 !
73 ! Determine Mantissa
74 !
75  if (iexp.ne.255) then
76  if (iexp.ne.0) then
77  atemp=(atemp/(2.0**n))-1.0
78  else
79  atemp=atemp*two126
80  endif
81  imant=nint(atemp*two23)
82  else
83  imant=0
84  endif
85  ! set mantissa bits ( bits 22-0 )
86  call mvbits(imant,0,23,ieee,0)
87 !
88 ! Transfer IEEE bit string to real variable
89 !
90  rieee(j)=transfer(ieee,rieee(j))
91 ! write(6,fmt='(f20.10,5x,b32)') a,a
92 ! write(6,fmt='(f20.10,5x,b32)') rieee,rieee
93 
94  enddo
95 
96  return
97  end
98 
mkieee
subroutine mkieee(a, rieee, num)
This subroutine stores a list of real values in 32-bit IEEE floating point format.
Definition: mkieee.f:17