Line data Source code
1 : /* s_rintf.c -- float version of s_rint.c.
2 : * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
3 : */
4 :
5 : /*
6 : * ====================================================
7 : * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
8 : *
9 : * Developed at SunPro, a Sun Microsystems, Inc. business.
10 : * Permission to use, copy, modify, and distribute this
11 : * software is freely granted, provided that this notice
12 : * is preserved.
13 : * ====================================================
14 : */
15 :
16 : //#include <sys/cdefs.h>
17 : //__FBSDID("$FreeBSD$");
18 :
19 : #include <float.h>
20 : #include <stdint.h>
21 :
22 : #include "math_private.h"
23 :
24 : static const float
25 : TWO23[2]={
26 : 8.3886080000e+06, /* 0x4b000000 */
27 : -8.3886080000e+06, /* 0xcb000000 */
28 : };
29 :
30 : float
31 0 : rintf(float x)
32 : {
33 : int32_t i0,j0,sx;
34 : float w,t;
35 0 : GET_FLOAT_WORD(i0,x);
36 0 : sx = (i0>>31)&1;
37 0 : j0 = ((i0>>23)&0xff)-0x7f;
38 0 : if(j0<23) {
39 0 : if(j0<0) {
40 0 : if((i0&0x7fffffff)==0) return x;
41 0 : STRICT_ASSIGN(float,w,TWO23[sx]+x);
42 0 : t = w-TWO23[sx];
43 0 : GET_FLOAT_WORD(i0,t);
44 0 : SET_FLOAT_WORD(t,(i0&0x7fffffff)|(sx<<31));
45 0 : return t;
46 : }
47 0 : STRICT_ASSIGN(float,w,TWO23[sx]+x);
48 0 : return w-TWO23[sx];
49 : }
50 0 : if(j0==0x80) return x+x; /* inf or NaN */
51 0 : else return x; /* x is integral */
52 : }
|