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

VxWorks

开发平台:

C/C++

  1. /* modf.c - separate floating-point number into integer and fraction parts */
  2. /* Copyright 1992-1993 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01j,19mar95,dvs  removed TRON ifdef - no longer supported.
  7. 01i,05feb93,jdi  doc changes based on kdl review.
  8. 01h,02dec92,jdi  doc tweaks.
  9. 01g,28oct92,jdi  documentation cleanup.
  10. 01f,20sep92,smb  documentation additions
  11. 01e,10sep92,wmd  changed dummy function for i960KB from printf to bcopy.
  12. 01d,04sep92,wmd  restored to rev 1b, instead modified mathP.h using  _BYTE_ORDER 
  13.  conditionals to flip the contents of struct DOUBLE.  Added a dummy
  14.  printf() in order to force compiler to compile code correctly for i960kb.
  15. 01c,03sep92,wmd  modified modf() for the i960, word order for DOUBLE is reversed.
  16. 01b,25jul92,kdl  replaced modf() routine contents with version from floatLib.c;
  17.  deleted isnan(), iszero(), isinf(), _d_type().
  18. 01a,08jul92,smb  documentation.
  19. */
  20. /*
  21. DESCRIPTION
  22. SEE ALSO: American National Standard X3.159-1989
  23. NOMANUAL
  24. */
  25. #include "vxWorks.h"
  26. #include "math.h"
  27. #include "stddef.h"
  28. #include "errno.h"
  29. #include "private/mathP.h"
  30. /*******************************************************************************
  31. *
  32. * modf - separate a floating-point number into integer and fraction parts (ANSI)
  33. *
  34. * This routine stores the integer portion of <value>
  35. * in <pIntPart> and returns the fractional portion.
  36. * Both parts are double precision and will have the same sign as <value>.
  37. *
  38. * INCLUDE FILES: math.h
  39. *
  40. * RETURNS: The double-precision fractional portion of <value>.
  41. *
  42. * SEE ALSO: frexp(), ldexp()
  43. */
  44. double modf
  45.     (
  46.     double value,               /* value to split                  */
  47.     double *pIntPart            /* where integer portion is stored */
  48.     )
  49.     {
  50.     DOUBLE  dat;
  51.     FAST int  exp;
  52.     FAST double fracPart;
  53.     FAST double intPart;
  54.     int  negflag = (value < 0);
  55.     if (negflag)
  56.         value = -value; /* make it positive */
  57.     dat.ddat = value;
  58.     /* Separate the exponent, and change it from biased to 2's comp. */
  59.     exp = ((dat.ldat.l1 & 0x7ff00000) >> 20) - 1023;
  60. #if CPU==I960KB
  61.     bcopy ((char *)&negflag, (char *)&negflag, 0);
  62. #endif  /* CPU==I960KB - to force gcc960 to compile correct code for the i960kb */
  63.     
  64.     if (exp <= -1)
  65.         {
  66. /* If exponent is negative, fracPart == |value|, and intPart == 0. */
  67.         fracPart = value;
  68.         intPart = 0.;
  69.         }
  70.     /* clear the fractional part in dat */
  71.     else if (exp <= 20)
  72.         {
  73.         dat.ldat.l1 &= (-1 << (20 - exp));
  74.         dat.ldat.l2 = 0;
  75.         intPart = dat.ddat;
  76.         fracPart = value - intPart;
  77.         }
  78.     else if (exp <= 52)
  79.         {
  80.         dat.ldat.l2 &= (-1 << (52 - exp));
  81.         intPart = dat.ddat;
  82.         fracPart = value - intPart;
  83. }
  84.     else
  85.         {
  86.         fracPart = 0.;
  87.         intPart = value;
  88.         }
  89.     *pIntPart = (negflag ? -intPart : intPart);
  90.     return (negflag ? -fracPart : fracPart);
  91.     }