float.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:2k
源码类别:

Windows CE

开发平台:

C/C++

  1. ////////////////////////////////////////////////////////////////////////////
  2. //      **** WAVPACK ****   //
  3. //     Hybrid Lossless Wavefile Compressor   //
  4. // Copyright (c) 1998 - 2004 Conifer Software.   //
  5. //     All Rights Reserved.   //
  6. //      Distributed under the BSD Software License (see license.txt)      //
  7. ////////////////////////////////////////////////////////////////////////////
  8. // float.c
  9. #include "wavpack.h"
  10. int read_float_info (WavpackStream *wps, WavpackMetadata *wpmd)
  11. {
  12.     int bytecnt = wpmd->byte_length;
  13.     char *byteptr = wpmd->data;
  14.     if (bytecnt != 4)
  15. return FALSE;
  16.     wps->float_flags = *byteptr++;
  17.     wps->float_shift = *byteptr++;
  18.     wps->float_max_exp = *byteptr++;
  19.     wps->float_norm_exp = *byteptr;
  20.     return TRUE;
  21. }
  22. void float_values (WavpackStream *wps, long *values, long num_values)
  23. {
  24.     while (num_values--) {
  25. int shift_count = 0, exp = wps->float_max_exp;
  26. f32 outval = { 0, 0, 0 };
  27. if (*values) {
  28.     *values <<= wps->float_shift;
  29.     if (*values < 0) {
  30. *values = -*values;
  31. outval.sign = 1;
  32.     }
  33.     if (*values == 0x1000000)
  34. outval.exponent = 255;
  35.     else {
  36. if (exp)
  37.     while (!(*values & 0x800000) && --exp) {
  38. shift_count++;
  39. *values <<= 1;
  40.     }
  41. if (shift_count && (wps->float_flags & FLOAT_SHIFT_ONES))
  42.     *values |= ((1 << shift_count) - 1);
  43. outval.mantissa = *values;
  44. outval.exponent = exp;
  45.     }
  46. }
  47. * (f32 *) values++ = outval;
  48.     }
  49. }
  50. void float_normalize (long *values, long num_values, int delta_exp)
  51. {
  52.     f32 *fvalues = (f32 *) values, fzero = { 0, 0, 0 };
  53.     int exp;
  54.     if (!delta_exp)
  55. return;
  56.     while (num_values--) {
  57. if ((exp = fvalues->exponent) == 0 || exp + delta_exp <= 0)
  58.     *fvalues = fzero;
  59. else if (exp == 255 || (exp += delta_exp) >= 255) {
  60.     fvalues->exponent = 255;
  61.     fvalues->mantissa = 0;
  62. }
  63. else
  64.     fvalues->exponent = exp;
  65. fvalues++;
  66.     }
  67. }