home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1994 #1 / monster.zip / monster / PROG_C / SNPD9404.ZIP / MSB2IEEE.C < prev    next >
C/C++ Source or Header  |  1994-04-03  |  2KB  |  60 lines

  1. /***  MSBIN conversion routines    ***/
  2. /***  public domain by Jeffery Foy ***/
  3.  
  4. union Converter {
  5.       unsigned char uc[10];
  6.       unsigned int  ui[5];
  7.       unsigned long ul[2];
  8.       float          f[2];
  9.       double         d[1];
  10. };
  11.  
  12. /* MSBINToIEEE - Converts an MSBIN floating point number */
  13. /*               to IEEE floating point format           */
  14. /*                                                       */
  15. /*  Input: f - floating point number in MSBIN format     */
  16. /* Output: Same number in IEEE format                    */
  17.  
  18. float MSBINToIEEE(float f)
  19. {
  20.       union Converter t;
  21.       int sign, exp;       /* sign and exponent */
  22.  
  23.       t.f[0] = f;
  24.  
  25.       /* extract the sign & move exponent bias from 0x81 to 0x7f */
  26.  
  27.       sign = t.uc[2] / 0x80;
  28.       exp  = (t.uc[3] - 0x81 + 0x7f) & 0xff;
  29.  
  30.       /* reassemble them in IEEE 4 byte real number format */
  31.  
  32.       t.ui[1] = (t.ui[1] & 0x7f) | (exp << 7) | (sign << 15);
  33.       return t.f[0];
  34. } /* End of MSBINToIEEE */
  35.  
  36.  
  37. /* IEEEToMSBIN - Converts an IEEE floating point number  */
  38. /*               to MSBIN floating point format          */
  39. /*                                                       */
  40. /*  Input: f - floating point number in IEEE format      */
  41. /* Output: Same number in MSBIN format                   */
  42.  
  43. float IEEEToMSBIN(float f)
  44. {
  45.       union Converter t;
  46.       int sign, exp;       /* sign and exponent */
  47.  
  48.       t.f[0] = f;
  49.  
  50.       /* extract sign & change exponent bias from 0x7f to 0x81 */
  51.  
  52.       sign = t.uc[3] / 0x80;
  53.       exp  = ((t.ui[1] >> 7) - 0x7f + 0x81) & 0xff;
  54.  
  55.       /* reassemble them in MSBIN format */
  56.  
  57.       t.ui[1] = (t.ui[1] & 0x7f) | (sign << 7) | (exp << 8);
  58.       return t.f[0];
  59. } /* End of IEEEToMSBIN */
  60.