home *** CD-ROM | disk | FTP | other *** search
/ Game Zone - 1,000+ Games / GAMEZONE.BIN / Programs / PALM / Oh-One / src / s_modf.c < prev    next >
C/C++ Source or Header  |  1999-04-13  |  2KB  |  89 lines

  1. /* @(#)s_modf.c 5.1 93/09/24 */
  2. /*
  3.  * ====================================================
  4.  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
  5.  *
  6.  * Developed at SunPro, a Sun Microsystems, Inc. business.
  7.  * Permission to use, copy, modify, and distribute this
  8.  * software is freely granted, provided that this notice
  9.  * is preserved.
  10.  * ====================================================
  11.  */
  12.  
  13. #if defined(LIBM_SCCS) && !defined(lint)
  14. static char rcsid[] = "$NetBSD: s_modf.c,v 1.8 1995/05/10 20:47:55 jtc Exp $";
  15. #endif
  16.  
  17. /*
  18.  * modf(double x, double *iptr)
  19.  * return fraction part of x, and return x's integral part in *iptr.
  20.  * Method:
  21.  *    Bit twiddling.
  22.  *
  23.  * Exception:
  24.  *    No exception.
  25.  */
  26.  
  27. #include "math.h"
  28. #include "math_private.h"
  29.  
  30. #ifdef __STDC__
  31. static const double one = 1.0;
  32. #else
  33. static double one = 1.0;
  34. #endif
  35.  
  36. #ifdef __STDC__
  37.     double __modf(double x, double *iptr)
  38. #else
  39.     double __modf(x, iptr)
  40.     double x,*iptr;
  41. #endif
  42. {
  43.     int32_t i0,i1,j0;
  44.     u_int32_t i;
  45.     EXTRACT_WORDS(i0,i1,x);
  46.     j0 = ((i0>>20)&0x7ff)-0x3ff;    /* exponent of x */
  47.     if(j0<20) {            /* integer part in high x */
  48.         if(j0<0) {            /* |x|<1 */
  49.             INSERT_WORDS(*iptr,i0&0x80000000,0);    /* *iptr = +-0 */
  50.         return x;
  51.         } else {
  52.         i = (0x000fffff)>>j0;
  53.         if(((i0&i)|i1)==0) {        /* x is integral */
  54.             u_int32_t high;
  55.             *iptr = x;
  56.             GET_HIGH_WORD(high,x);
  57.             INSERT_WORDS(x,high&0x80000000,0);    /* return +-0 */
  58.             return x;
  59.         } else {
  60.             INSERT_WORDS(*iptr,i0&(~i),0);
  61.             return x - *iptr;
  62.         }
  63.         }
  64.     } else if (j0>51) {        /* no fraction part */
  65.         u_int32_t high;
  66.         *iptr = x*one;
  67.         GET_HIGH_WORD(high,x);
  68.         INSERT_WORDS(x,high&0x80000000,0);    /* return +-0 */
  69.         return x;
  70.     } else {            /* fraction part in low x */
  71.         i = ((u_int32_t)(0xffffffff))>>(j0-20);
  72.         if((i1&i)==0) {         /* x is integral */
  73.             u_int32_t high;
  74.         *iptr = x;
  75.         GET_HIGH_WORD(high,x);
  76.         INSERT_WORDS(x,high&0x80000000,0);    /* return +-0 */
  77.         return x;
  78.         } else {
  79.             INSERT_WORDS(*iptr,i0,i1&(~i));
  80.         return x - *iptr;
  81.         }
  82.     }
  83. }
  84. weak_alias (__modf, modf)
  85. #ifdef NO_LONG_DOUBLE
  86. strong_alias (__modf, __modfl)
  87. weak_alias (__modf, modfl)
  88. #endif
  89.