Last change
on this file was 2, checked in by bird, 22 years ago |
Initial revision
|
-
Property cvs2svn:cvs-rev
set to
1.1
-
Property svn:eol-style
set to
native
-
Property svn:executable
set to
*
|
File size:
1.6 KB
|
Line | |
---|
1 | /* sf_rint.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 "fdlibm.h"
|
---|
17 |
|
---|
18 | #ifdef __STDC__
|
---|
19 | static const float
|
---|
20 | #else
|
---|
21 | static float
|
---|
22 | #endif
|
---|
23 | TWO23[2]={
|
---|
24 | 8.3886080000e+06, /* 0x4b000000 */
|
---|
25 | -8.3886080000e+06, /* 0xcb000000 */
|
---|
26 | };
|
---|
27 |
|
---|
28 | #ifdef __STDC__
|
---|
29 | float rintf(float x)
|
---|
30 | #else
|
---|
31 | float rintf(x)
|
---|
32 | float x;
|
---|
33 | #endif
|
---|
34 | {
|
---|
35 | int32_t i0,j0,sx;
|
---|
36 | uint32_t i,i1;
|
---|
37 | float w,t;
|
---|
38 | GET_FLOAT_WORD(i0,x);
|
---|
39 | sx = (i0>>31)&1;
|
---|
40 | j0 = ((i0>>23)&0xff)-0x7f;
|
---|
41 | if(j0<23) {
|
---|
42 | if(j0<0) {
|
---|
43 | if((i0&0x7fffffff)==0) return x;
|
---|
44 | i1 = (i0&0x07fffff);
|
---|
45 | i0 &= 0xfff00000;
|
---|
46 | i0 |= ((i1|-i1)>>9)&0x400000;
|
---|
47 | SET_FLOAT_WORD(x,i0);
|
---|
48 | w = TWO23[sx]+x;
|
---|
49 | t = w-TWO23[sx];
|
---|
50 | GET_FLOAT_WORD(i0,t);
|
---|
51 | SET_FLOAT_WORD(t,(i0&0x7fffffff)|(sx<<31));
|
---|
52 | return t;
|
---|
53 | } else {
|
---|
54 | i = (0x007fffff)>>j0;
|
---|
55 | if((i0&i)==0) return x; /* x is integral */
|
---|
56 | i>>=1;
|
---|
57 | if((i0&i)!=0) i0 = (i0&(~i))|((0x100000)>>j0);
|
---|
58 | }
|
---|
59 | } else {
|
---|
60 | if(j0==0x80) return x+x; /* inf or NaN */
|
---|
61 | else return x; /* x is integral */
|
---|
62 | }
|
---|
63 | SET_FLOAT_WORD(x,i0);
|
---|
64 | w = TWO23[sx]+x;
|
---|
65 | return w-TWO23[sx];
|
---|
66 | }
|
---|
67 |
|
---|
68 | #ifdef _DOUBLE_IS_32BITS
|
---|
69 |
|
---|
70 | #ifdef __STDC__
|
---|
71 | double rint(double x)
|
---|
72 | #else
|
---|
73 | double rint(x)
|
---|
74 | double x;
|
---|
75 | #endif
|
---|
76 | {
|
---|
77 | return (double) rintf((float) x);
|
---|
78 | }
|
---|
79 |
|
---|
80 | #endif /* defined(_DOUBLE_IS_32BITS) */
|
---|
Note:
See
TracBrowser
for help on using the repository browser.