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
166a876b92SBruce Evans #include <float.h>
176a876b92SBruce Evans #include <stdint.h>
186a876b92SBruce Evans
193a8617a8SJordan K. Hubbard #include "math.h"
203a8617a8SJordan K. Hubbard #include "math_private.h"
213a8617a8SJordan K. Hubbard
22c4da2324SDavid Schultz static const float
233a8617a8SJordan K. Hubbard TWO23[2]={
243a8617a8SJordan K. Hubbard 8.3886080000e+06, /* 0x4b000000 */
253a8617a8SJordan K. Hubbard -8.3886080000e+06, /* 0xcb000000 */
263a8617a8SJordan K. Hubbard };
273a8617a8SJordan K. Hubbard
2859b19ff1SAlfred Perlstein float
rintf(float x)2959b19ff1SAlfred Perlstein rintf(float x)
303a8617a8SJordan K. Hubbard {
313a8617a8SJordan K. Hubbard int32_t i0,j0,sx;
326a876b92SBruce Evans float w,t;
333a8617a8SJordan K. Hubbard GET_FLOAT_WORD(i0,x);
343a8617a8SJordan K. Hubbard sx = (i0>>31)&1;
353a8617a8SJordan K. Hubbard j0 = ((i0>>23)&0xff)-0x7f;
363a8617a8SJordan K. Hubbard if(j0<23) {
373a8617a8SJordan K. Hubbard if(j0<0) {
383a8617a8SJordan K. Hubbard if((i0&0x7fffffff)==0) return x;
396a876b92SBruce Evans STRICT_ASSIGN(float,w,TWO23[sx]+x);
403a8617a8SJordan K. Hubbard t = w-TWO23[sx];
4111860542SBruce Evans GET_FLOAT_WORD(i0,t);
4211860542SBruce Evans SET_FLOAT_WORD(t,(i0&0x7fffffff)|(sx<<31));
433a8617a8SJordan K. Hubbard return t;
443a8617a8SJordan K. Hubbard }
456a876b92SBruce Evans STRICT_ASSIGN(float,w,TWO23[sx]+x);
463a8617a8SJordan K. Hubbard return w-TWO23[sx];
473a8617a8SJordan K. Hubbard }
48c4da2324SDavid Schultz if(j0==0x80) return x+x; /* inf or NaN */
49c4da2324SDavid Schultz else return x; /* x is integral */
50c4da2324SDavid Schultz }
51