1 : #include "grib2.h"
2 :
3 4 : void rdieee(g2int *rieee,g2float *a,g2int num)
4 : //$$$ SUBPROGRAM DOCUMENTATION BLOCK
5 : // . . . .
6 : // SUBPROGRAM: rdieee
7 : // PRGMMR: Gilbert ORG: W/NP11 DATE: 2002-10-25
8 : //
9 : // ABSTRACT: This subroutine reads a list of real values in
10 : // 32-bit IEEE floating point format.
11 : //
12 : // PROGRAM HISTORY LOG:
13 : // 2002-10-25 Gilbert
14 : //
15 : // USAGE: void rdieee(g2int *rieee,g2float *a,g2int num)
16 : // INPUT ARGUMENT LIST:
17 : // rieee - g2int array of floating point values in 32-bit IEEE format.
18 : // num - Number of floating point values to convert.
19 : //
20 : // OUTPUT ARGUMENT LIST:
21 : // a - float array of real values. a must be allocated with at
22 : // least 4*num bytes of memory before calling this function.
23 : //
24 : // REMARKS: None
25 : //
26 : // ATTRIBUTES:
27 : // LANGUAGE: C
28 : // MACHINE: IBM SP
29 : //
30 : //$$$
31 : {
32 :
33 : g2int j;
34 : g2int isign,iexp,imant;
35 :
36 : g2float sign,temp;
37 : static g2float two23,two126;
38 : static g2int test=0;
39 4 : g2intu msk1=0x80000000; // 10000000000000000000000000000000 binary
40 4 : g2int msk2=0x7F800000; // 01111111100000000000000000000000 binary
41 4 : g2int msk3=0x007FFFFF; // 00000000011111111111111111111111 binary
42 :
43 4 : if ( test == 0 ) {
44 1 : two23=(g2float)int_power(2.0,-23);
45 1 : two126=(g2float)int_power(2.0,-126);
46 1 : test=1;
47 : }
48 :
49 8 : for (j=0;j<num;j++) {
50 : //
51 : // Extract sign bit, exponent, and mantissa
52 : //
53 4 : isign=(rieee[j]&msk1)>>31;
54 4 : iexp=(rieee[j]&msk2)>>23;
55 4 : imant=(rieee[j]&msk3);
56 : //printf("SAGieee= %ld %ld %ld\n",isign,iexp,imant);
57 :
58 4 : sign=1.0;
59 4 : if (isign == 1) sign=-1.0;
60 :
61 8 : if ( (iexp > 0) && (iexp < 255) ) {
62 4 : temp=(g2float)int_power(2.0,(iexp-127));
63 4 : a[j]=sign*temp*(1.0+(two23*(g2float)imant));
64 : }
65 0 : else if ( iexp == 0 ) {
66 0 : if ( imant != 0 )
67 0 : a[j]=sign*two126*two23*(g2float)imant;
68 : else
69 0 : a[j]=sign*0.0;
70 :
71 : }
72 0 : else if ( iexp == 255 )
73 0 : a[j]=sign*(1E+37);
74 :
75 :
76 : }
77 :
78 4 : }
|