1 
2 /* @(#)s_modf.c 1.3 95/01/18 */
3 /*
4  * ====================================================
5  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
6  *
7  * Developed at SunSoft, a Sun Microsystems, Inc. business.
8  * Permission to use, copy, modify, and distribute this
9  * software is freely granted, provided that this notice
10  * is preserved.
11  * ====================================================
12  */
13 
14 /*
15  * ieee_modf(double x, double *iptr)
16  * return fraction part of x, and return x's integral part in *iptr.
17  * Method:
18  *	Bit twiddling.
19  *
20  * Exception:
21  *	No exception.
22  */
23 
24 #include "fdlibm.h"
25 
26 #ifdef __STDC__
27 static const double one = 1.0;
28 #else
29 static double one = 1.0;
30 #endif
31 
32 #ifdef __STDC__
ieee_modf(double x,double * iptr)33 	double ieee_modf(double x, double *iptr)
34 #else
35 	double ieee_modf(x, iptr)
36 	double x,*iptr;
37 #endif
38 {
39 	int i0,i1,j0;
40 	unsigned i;
41 	i0 =  __HI(x);		/* high x */
42 	i1 =  __LO(x);		/* low  x */
43 	j0 = ((i0>>20)&0x7ff)-0x3ff;	/* exponent of x */
44 	if(j0<20) {			/* integer part in high x */
45 	    if(j0<0) {			/* |x|<1 */
46 		__HIp(iptr) = i0&0x80000000;
47 		__LOp(iptr) = 0;		/* *iptr = +-0 */
48 		return x;
49 	    } else {
50 		i = (0x000fffff)>>j0;
51 		if(((i0&i)|i1)==0) {		/* x is integral */
52 		    *iptr = x;
53 		    __HI(x) &= 0x80000000;
54 		    __LO(x)  = 0;	/* return +-0 */
55 		    return x;
56 		} else {
57 		    __HIp(iptr) = i0&(~i);
58 		    __LOp(iptr) = 0;
59 		    return x - *iptr;
60 		}
61 	    }
62 	} else if (j0>51) {		/* no fraction part */
63 	    *iptr = x*one;
64 	    __HI(x) &= 0x80000000;
65 	    __LO(x)  = 0;	/* return +-0 */
66 	    return x;
67 	} else {			/* fraction part in low x */
68 	    i = ((unsigned)(0xffffffff))>>(j0-20);
69 	    if((i1&i)==0) { 		/* x is integral */
70 		*iptr = x;
71 		__HI(x) &= 0x80000000;
72 		__LO(x)  = 0;	/* return +-0 */
73 		return x;
74 	    } else {
75 		__HIp(iptr) = i0;
76 		__LOp(iptr) = i1&(~i);
77 		return x - *iptr;
78 	    }
79 	}
80 }
81