1*05a0b428SJohn Marino /* s_modff.c -- float version of s_modf.c.
2*05a0b428SJohn Marino * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
3*05a0b428SJohn Marino */
4*05a0b428SJohn Marino
5*05a0b428SJohn Marino /*
6*05a0b428SJohn Marino * ====================================================
7*05a0b428SJohn Marino * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
8*05a0b428SJohn Marino *
9*05a0b428SJohn Marino * Developed at SunPro, a Sun Microsystems, Inc. business.
10*05a0b428SJohn Marino * Permission to use, copy, modify, and distribute this
11*05a0b428SJohn Marino * software is freely granted, provided that this notice
12*05a0b428SJohn Marino * is preserved.
13*05a0b428SJohn Marino * ====================================================
14*05a0b428SJohn Marino */
15*05a0b428SJohn Marino
16*05a0b428SJohn Marino #include "math.h"
17*05a0b428SJohn Marino #include "math_private.h"
18*05a0b428SJohn Marino
19*05a0b428SJohn Marino static const float one = 1.0;
20*05a0b428SJohn Marino
21*05a0b428SJohn Marino float
modff(float x,float * iptr)22*05a0b428SJohn Marino modff(float x, float *iptr)
23*05a0b428SJohn Marino {
24*05a0b428SJohn Marino int32_t i0,jj0;
25*05a0b428SJohn Marino u_int32_t i;
26*05a0b428SJohn Marino GET_FLOAT_WORD(i0,x);
27*05a0b428SJohn Marino jj0 = ((i0>>23)&0xff)-0x7f; /* exponent of x */
28*05a0b428SJohn Marino if(jj0<23) { /* integer part in x */
29*05a0b428SJohn Marino if(jj0<0) { /* |x|<1 */
30*05a0b428SJohn Marino SET_FLOAT_WORD(*iptr,i0&0x80000000); /* *iptr = +-0 */
31*05a0b428SJohn Marino return x;
32*05a0b428SJohn Marino } else {
33*05a0b428SJohn Marino i = (0x007fffff)>>jj0;
34*05a0b428SJohn Marino if((i0&i)==0) { /* x is integral */
35*05a0b428SJohn Marino u_int32_t ix;
36*05a0b428SJohn Marino *iptr = x;
37*05a0b428SJohn Marino GET_FLOAT_WORD(ix,x);
38*05a0b428SJohn Marino SET_FLOAT_WORD(x,ix&0x80000000); /* return +-0 */
39*05a0b428SJohn Marino return x;
40*05a0b428SJohn Marino } else {
41*05a0b428SJohn Marino SET_FLOAT_WORD(*iptr,i0&(~i));
42*05a0b428SJohn Marino return x - *iptr;
43*05a0b428SJohn Marino }
44*05a0b428SJohn Marino }
45*05a0b428SJohn Marino } else { /* no fraction part */
46*05a0b428SJohn Marino u_int32_t ix;
47*05a0b428SJohn Marino *iptr = x*one;
48*05a0b428SJohn Marino GET_FLOAT_WORD(ix,x);
49*05a0b428SJohn Marino SET_FLOAT_WORD(x,ix&0x80000000); /* return +-0 */
50*05a0b428SJohn Marino return x;
51*05a0b428SJohn Marino }
52*05a0b428SJohn Marino }
53