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

VxWorks

开发平台:

C/C++

  1. /* rint.c - round-to-integer routine */
  2. /* Copyright 1992 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01a,30jul92,smb  documentation.
  7. */
  8. /*
  9. DESCRIPTION
  10.  * algorithm for rint(x) in pseudo-pascal form ...
  11.  *
  12.  * real rint(x): real x;
  13.  *      ... delivers integer nearest x in direction of prevailing rounding
  14.  *      ... mode
  15.  * const        L = (last consecutive integer)/2
  16.  *        = 2**55; for VAX D
  17.  *        = 2**52; for IEEE 754 Double
  18.  * real s,t;
  19.  * begin
  20.  *      if x != x then return x;                ... NaN
  21.  *      if |x| >= L then return x;              ... already an integer
  22.  *      s := copysign(L,x);
  23.  *      t := x + s;                             ... = (x+s) rounded to integer
  24.  *      return t - s
  25.  * end;
  26.  *
  27.  * Note: Inexact will be signaled if x is not an integer, as is
  28.  *      customary for IEEE 754.  No other signal can be emitted.
  29. SEE ALSO: American National Standard X3.159-1989
  30. */
  31. #include "vxWorks.h"
  32. #include "math.h"
  33. #include "stddef.h"
  34. #include "errno.h"
  35. #include "private/mathP.h"
  36. #if defined(vax)||defined(tahoe)
  37. #ifdef vax
  38. #define _0x(A,B)        0x/**/A/**/B
  39. #else   /* vax */
  40. #define _0x(A,B)        0x/**/B/**/A
  41. #endif  /* vax */
  42. static long Lx[] = {_0x(0000,5c00),_0x(0000,0000)};     /* 2**55 */
  43. #define L *(double *) Lx
  44. #else   /* defined(vax)||defined(tahoe) */
  45. static double L = 4503599627370496.0E0;         /* 2**52 */
  46. #endif  /* defined(vax)||defined(tahoe) */
  47. /********************************************************************************     
  48. * rint -  needed for sparc math support 
  49. * RETURNS: 
  50. */
  51. double
  52. rint(x)
  53. double x;
  54. {
  55.         double s,t,one = 1.0,copysign();
  56. #if !defined(vax)&&!defined(tahoe)
  57.         if (x != x)                             /* NaN */
  58.                 return (x);
  59. #endif  /* !defined(vax)&&!defined(tahoe) */
  60.         if (copysign(x,one) >= L)               /* already an integer */
  61.             return (x);
  62.         s = copysign(L,x);
  63.         t = x + s;                              /* x+s rounded to integer */
  64.         return (t - s);
  65. }