13a8617a8SJordan K. Hubbard /* s_rintf.c -- float version of s_rint.c. 23a8617a8SJordan K. Hubbard * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. 33a8617a8SJordan K. Hubbard */ 43a8617a8SJordan K. Hubbard 53a8617a8SJordan K. Hubbard /* 63a8617a8SJordan K. Hubbard * ==================================================== 73a8617a8SJordan K. Hubbard * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 83a8617a8SJordan K. Hubbard * 93a8617a8SJordan K. Hubbard * Developed at SunPro, a Sun Microsystems, Inc. business. 103a8617a8SJordan K. Hubbard * Permission to use, copy, modify, and distribute this 113a8617a8SJordan K. Hubbard * software is freely granted, provided that this notice 123a8617a8SJordan K. Hubbard * is preserved. 133a8617a8SJordan K. Hubbard * ==================================================== 143a8617a8SJordan K. Hubbard */ 153a8617a8SJordan K. Hubbard 163a8617a8SJordan K. Hubbard #ifndef lint 173a8617a8SJordan K. Hubbard static char rcsid[] = "$Id: s_rintf.c,v 1.2 1994/08/18 23:07:17 jtc Exp $"; 183a8617a8SJordan K. Hubbard #endif 193a8617a8SJordan K. Hubbard 203a8617a8SJordan K. Hubbard #include "math.h" 213a8617a8SJordan K. Hubbard #include "math_private.h" 223a8617a8SJordan K. Hubbard 233a8617a8SJordan K. Hubbard #ifdef __STDC__ 243a8617a8SJordan K. Hubbard static const float 253a8617a8SJordan K. Hubbard #else 263a8617a8SJordan K. Hubbard static float 273a8617a8SJordan K. Hubbard #endif 283a8617a8SJordan K. Hubbard TWO23[2]={ 293a8617a8SJordan K. Hubbard 8.3886080000e+06, /* 0x4b000000 */ 303a8617a8SJordan K. Hubbard -8.3886080000e+06, /* 0xcb000000 */ 313a8617a8SJordan K. Hubbard }; 323a8617a8SJordan K. Hubbard 333a8617a8SJordan K. Hubbard #ifdef __STDC__ 343a8617a8SJordan K. Hubbard float rintf(float x) 353a8617a8SJordan K. Hubbard #else 363a8617a8SJordan K. Hubbard float rintf(x) 373a8617a8SJordan K. Hubbard float x; 383a8617a8SJordan K. Hubbard #endif 393a8617a8SJordan K. Hubbard { 403a8617a8SJordan K. Hubbard int32_t i0,j0,sx; 413a8617a8SJordan K. Hubbard u_int32_t i,i1; 423a8617a8SJordan K. Hubbard float w,t; 433a8617a8SJordan K. Hubbard GET_FLOAT_WORD(i0,x); 443a8617a8SJordan K. Hubbard sx = (i0>>31)&1; 453a8617a8SJordan K. Hubbard j0 = ((i0>>23)&0xff)-0x7f; 463a8617a8SJordan K. Hubbard if(j0<23) { 473a8617a8SJordan K. Hubbard if(j0<0) { 483a8617a8SJordan K. Hubbard if((i0&0x7fffffff)==0) return x; 493a8617a8SJordan K. Hubbard i1 = (i0&0x07fffff); 503a8617a8SJordan K. Hubbard i0 &= 0xfff00000; 513a8617a8SJordan K. Hubbard i0 |= ((i1|-i1)>>9)&0x400000; 523a8617a8SJordan K. Hubbard SET_FLOAT_WORD(x,i0); 533a8617a8SJordan K. Hubbard w = TWO23[sx]+x; 543a8617a8SJordan K. Hubbard t = w-TWO23[sx]; 553a8617a8SJordan K. Hubbard GET_FLOAT_WORD(i0,t); 563a8617a8SJordan K. Hubbard SET_FLOAT_WORD(t,(i0&0x7fffffff)|(sx<<31)); 573a8617a8SJordan K. Hubbard return t; 583a8617a8SJordan K. Hubbard } else { 593a8617a8SJordan K. Hubbard i = (0x007fffff)>>j0; 603a8617a8SJordan K. Hubbard if((i0&i)==0) return x; /* x is integral */ 613a8617a8SJordan K. Hubbard i>>=1; 623a8617a8SJordan K. Hubbard if((i0&i)!=0) i0 = (i0&(~i))|((0x100000)>>j0); 633a8617a8SJordan K. Hubbard } 643a8617a8SJordan K. Hubbard } else { 653a8617a8SJordan K. Hubbard if(j0==0x80) return x+x; /* inf or NaN */ 663a8617a8SJordan K. Hubbard else return x; /* x is integral */ 673a8617a8SJordan K. Hubbard } 683a8617a8SJordan K. Hubbard SET_FLOAT_WORD(x,i0); 693a8617a8SJordan K. Hubbard w = TWO23[sx]+x; 703a8617a8SJordan K. Hubbard return w-TWO23[sx]; 713a8617a8SJordan K. Hubbard } 72