ghosh@hubcap.UUCP (Amitava Ghosh) (07/22/88)
does anyone know what the difference is between the IEEE floating point representation and the way the VAX stores numbers. If so how does one convert from one format to the other. thanks in advance. Amitava Ghosh ghosh@clemson.bitnet ghosh@prism.clemson.edu
woods@ncar.ucar.edu (Greg Woods) (07/22/88)
In article <2256@hubcap.UUCP> ghosh@hubcap.UUCP (Amitava Ghosh) writes: >does anyone know what the difference is between the IEEE floating >point representation and the way the VAX stores numbers. If so >how does one convert from one format to the other. Here's some C subroutines to convert back and forth between VAX and IEEE format. I use them to convert binary files between VAXes and Suns and it works fairly well. They all take a pointer to the data and how many data elements to convert as arguments. --Greg ------------------------------------------------------------------------- union ie3float { char c[4]; int exp; float f; }; void vf2ie3f(u,n) register union ie3float *u; register int n; { /* VAX float to IEEE float */ register char tmp; register int i; for (i=0; i < n; u++,i++) { if (! u->exp) continue; tmp=u->c[0]; u->c[0]=u->c[1]-1; u->c[1]=tmp; tmp=u->c[2]; u->c[2]=u->c[3]; u->c[3]=tmp; } } void ie3f2vf(u,n) register union ie3float *u; register int n; { /* IEEE float to VAX float */ register char tmp; register int i; for (i=0; i < n; u++,i++) { if (! u->exp) continue; tmp=u->c[0]+1; u->c[0]=u->c[1]; u->c[1]=tmp; tmp=u->c[2]; u->c[2]=u->c[3]; u->c[3]=tmp; } } void i4conv(u,n) union ie3float *u; register int n; { /* 4-byte integers; self-inverting operation so only one routine needed to go both ways */ register char tmp; register int i; for (i=0; i < n; u++,i++) { tmp=u->c[0]; u->c[0]=u->c[3]; u->c[3]=tmp; tmp=u->c[1]; u->c[1]=u->c[2]; u->c[2]=tmp; } } void i2conv(u,n) register union ie3float *u; int n; { swab(u,2*n); /* included for the hell of it */ }
pack@acdpyr.ucar.edu (Dan Packman) (07/23/88)
In article <2256@hubcap.UUCP> ghosh@hubcap.UUCP (Amitava Ghosh) writes: >does anyone know what the difference is between the IEEE floating >point representation and the way the VAX stores numbers. If so >how does one convert from one format to the other... The following program converts from vax f format to IEEE (UNIX point of view) --------cut here------------- subroutine vax2lcl(n,iarray) dimension iarray(n) character*1 conv(4),ccc integer iconv equivalence (iconv,conv) c Convert from vax floating point f format to pyramid IEEE single do 10 i=1,n iconv=iarray(i) if (iconv.ne.0) then ccc=conv(1) iii=ichar(conv(2))-1 if (iii.lt.0)then write(0,100)iconv 100 format(' vax2lcl: overflow int in =',i10) call exit(1) endif conv(1)=char(iii) conv(2)=ccc ccc=conv(3) conv(3)=conv(4) conv(4)=ccc iarray(i)=iconv endif 10 continue return end --------cut here------------- The following converts an array of IEEE single floats to vax floats It is written to work on a VAX/VMS machine --------cut here------------- subroutine pyr2lcl(n,iarray) dimension iarray(n) byte conv(4),ccc integer iconv equivalence (iconv,conv) c Convert from pyramid IEEE single to vax floating point f format do 10 i=1,n iconv=iarray(i) if (iconv.ne.0) then ccc=conv(2) iii=conv(1)+1 if (iii.gt.255)then write(0,100)iconv 100 format(' pyr2lcl: overflow int in =',i10) call exit(1) endif conv(2)=iii conv(1)=ccc ccc=conv(3) conv(3)=conv(4) conv(4)=ccc iarray(i)=iconv endif 10 continue return end