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 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