subroutine tunifd (fdin, fdout) double precision fdin, fdout double precision din, dout integer iuexp, itemp(2), otemp(2) equivalence (din, itemp), (dout, otemp) din = fdin if (itemp(1).eq.0 .and. itemp(2).eq.0) then otemp(1) = 0 otemp(2) = 0 go to 300 endif iuexp = (iand (ishft (itemp(1),-24),127) - 64) * 4 + 1022 k = 0 if (btest (itemp(1),23)) go to 100 k = k + 1 if (btest (itemp(1),22)) go to 100 k = k + 1 if (btest (itemp(1),21)) go to 100 k = k + 1 100 iuexp = iuexp - k otemp(1) = ishft (itemp(1),k-3) otemp(2) = ishft (itemp(2),k-3) if (3-k.ge.1) otemp(2) = ibclr (otemp(2),31) if (3-k.ge.2) otemp(2) = ibclr (otemp(2),30) if (3-k.ge.3) otemp(2) = ibclr (otemp(2),29) otemp(2) = ior(ishft(iand (itemp(1),2**(3-k)-1),32-3+k),otemp(2)) otemp(1) = ishft (iuexp,20) + iand (otemp(1),1048575) c /* 1048575 is 20 1's */ if (btest (itemp(1),31)) otemp(1) = ibset (otemp(1),31) 300 fdout = dout return end