frexp.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:2k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* frexp.c - frexp math routine */
  2. /* Copyright 1992-1996 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01j,23may01,to   doc fix
  7. 01i,05feb99,dgp  document errno values
  8. 01h,05aug96,dbt  frexp now returned a value >= 0.5 and strictly less than 1.0.
  9.  (SPR #4280).
  10.  Updated copyright.
  11. 01g,05feb93,jdi  doc changes based on kdl review.
  12. 01f,02dec92,jdi  doc tweaks.
  13. 01e,28oct92,jdi  documentation cleanup.
  14. 01d,21sep92,smb  replaced orignal versions.
  15. 01c,20sep92,smb  documentation additions
  16. 01b,30jul92,kdl  replaced routine contents with frexp() from floatLib.c.
  17. 01a,08jul92,smb  written, documentation.
  18. */
  19. /*
  20. DESCRIPTION
  21. SEE ALSO: American National Standard X3.159-1989
  22. NOMANUAL
  23. */
  24. #include "math.h"
  25. #include "stddef.h"
  26. #include "errno.h"
  27. #include "private/mathP.h"
  28. /*******************************************************************************
  29. *
  30. * frexp - break a floating-point number into a normalized fraction and power of 2 (ANSI)
  31. *
  32. * This routine breaks a double-precision number <value> into a normalized
  33. * fraction and integral power of 2.  It stores the integer exponent in <pexp>.
  34. *
  35. * INCLUDE FILES: math.h
  36. *
  37. * RETURNS: 
  38. * The double-precision value <x>, such that the magnitude of <x> is
  39. * in the interval [1/2,1) or zero, and <value> equals <x> times
  40. * 2 to the power of <pexp>. If <value> is zero, both parts of the result
  41. * are zero.
  42. * ERRNO: EDOM
  43. *
  44. */
  45. double frexp
  46.     (
  47.     double value, /* number to be normalized */
  48.     int *pexp    /* pointer to the exponent */
  49.     )
  50.     {
  51.     double r;
  52.     *pexp = 0;
  53.     /* determine number type */
  54.     switch (fpTypeGet(value, &r))
  55.        {
  56.         case NAN: /* NOT A NUMBER */
  57.      case INF: /* INFINITE */
  58.             errno = EDOM;
  59.     return (value);
  60.      case ZERO: /* ZERO */
  61.     return (0.0);
  62. default:
  63.     /*
  64.      * return value must be strictly less than 1.0 and >=0.5 .
  65.      */
  66.     if ((r = fabs(value)) >= 1.0)
  67.         for(; (r >= 1.0); (*pexp)++, r /= 2.0);
  68.     else
  69.         for(; (r < 0.5); (*pexp)--, r *= 2.0);
  70.     return (value < 0 ? -r : r);
  71.         }
  72.     }