NCEPLIBS-g2c  1.6.4
mkieee.c
Go to the documentation of this file.
1 
4 #include <stdlib.h>
5 #include <math.h>
6 #include "grib2.h"
7 
8 
21 void mkieee(g2float *a,g2int *rieee,g2int num)
22 {
23 
24  g2int j,n,ieee,iexp,imant;
25  double atemp;
26 
27  static double two23,two126;
28  static g2int test=0;
29  //g2intu msk1=0x80000000; // 10000000000000000000000000000000 binary
30  //g2int msk2=0x7F800000; // 01111111100000000000000000000000 binary
31  //g2int msk3=0x007FFFFF; // 00000000011111111111111111111111 binary
32 
33  if ( test == 0 ) {
34  two23=(double)int_power(2.0,23);
35  two126=(double)int_power(2.0,126);
36  test=1;
37  }
38 
39  for (j=0;j<num;j++) {
40 
41  ieee=0;
42 
43  if (a[j] == 0.0) {
44  rieee[j]=ieee;
45  continue;
46  }
47 
48 //
49 // Set Sign bit (bit 31 - leftmost bit)
50 //
51  if (a[j] < 0.0) {
52  ieee= 1 << 31;
53  atemp=-1.0*a[j];
54  }
55  else {
56  ieee= 0 << 31;
57  atemp=a[j];
58  }
59  //printf("sign %ld %x \n",ieee,ieee);
60 //
61 // Determine exponent n with base 2
62 //
63  if ( atemp >= 1.0 ) {
64  n = 0;
65  while ( int_power(2.0,n+1) <= atemp ) {
66  n++;
67  }
68  }
69  else {
70  n = -1;
71  while ( int_power(2.0,n) > atemp ) {
72  n--;
73  }
74  }
75  iexp=n+127;
76  if (n > 127) iexp=255; // overflow
77  if (n < -127) iexp=0;
78  //printf("exp %ld %ld \n",iexp,n);
79  // set exponent bits ( bits 30-23 )
80  ieee = ieee | ( iexp << 23 );
81 //
82 // Determine Mantissa
83 //
84  if (iexp != 255) {
85  if (iexp != 0)
86  atemp=(atemp/int_power(2.0,n))-1.0;
87  else
88  atemp=atemp*two126;
89  imant=(g2int)rint(atemp*two23);
90  }
91  else {
92  imant=0;
93  }
94  //printf("mant %ld %x \n",imant,imant);
95  // set mantissa bits ( bits 22-0 )
96  ieee = ieee | imant;
97 //
98 // Transfer IEEE bit string to rieee array
99 //
100  rieee[j]=ieee;
101 
102  }
103 
104  return;
105 
106 }
Header file for NCEPLIBS-g2c library.
float g2float
Float type.
Definition: grib2.h:22
int64_t g2int
Long integer type.
Definition: grib2.h:20
double int_power(double x, g2int y)
Function similar to C pow() power function.
Definition: int_power.c:17
void mkieee(g2float *a, g2int *rieee, g2int num)
This subroutine stores a list of real values in 32-bit IEEE floating point format.
Definition: mkieee.c:21