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