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

VxWorks

开发平台:

C/C++

  1. /* ldexp.c - ldexp math routine */
  2. /* Copyright 1992-1993 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01h,05feb99,dgp  document errno values
  7. 01g,05feb93,jdi  doc changes based on kdl review.
  8. 01f,02dec92,jdi  doc tweaks.
  9. 01e,28oct92,jdi  documentation cleanup.
  10. 01d,21sep92,smb  replaced original version.
  11. 01c,20sep92,smb  documentation additions
  12. 01b,30jul92,kdl  replaced routine contents with ldexp() from floatLib.c.
  13. 01a,08jul92,smb  written, documentation.
  14. */
  15. /*
  16. DESCRIPTION
  17. SEE ALSO: American National Standard X3.159-1989
  18. NOMANUAL
  19. */
  20. #include "math.h"
  21. #include "stddef.h"
  22. #include "errno.h"
  23. #include "private/mathP.h"
  24. /*******************************************************************************
  25. *
  26. * ldexp - multiply a number by an integral power of 2 (ANSI)
  27. *
  28. * This routine multiplies a floating-point number by an integral power of 2.
  29. * A range error may occur.
  30. *
  31. * INCLUDE FILES: math.h
  32. *
  33. * RETURNS: The double-precision value of <v> times 2 to the power of <xexp>.
  34. *
  35. * ERRNO: EDOM, ERANGE
  36. *
  37. */
  38. double ldexp
  39.     (
  40.     double v, /* a floating point number */
  41.     int xexp /* exponent                */
  42.     )
  43.     {
  44.     double zero = 0.0;
  45.     switch (fpTypeGet (v, NULL))
  46.         {
  47.         case NAN: /* NOT A NUMBER */
  48.             errno = EDOM;
  49.     break;
  50.      case INF: /* INFINITE */
  51.     errno = ERANGE;
  52.     break;
  53.      case ZERO: /* ZERO */
  54.     return (zero);
  55. default:
  56.     if (xexp >= 0)
  57. for(; (xexp > 0); xexp--, v *= 2.0);
  58.     else
  59. for(; (xexp < 0); xexp++, v /= 2.0);
  60.     return (v);
  61.      }
  62.     return (zero);
  63.     }