Contents of /trunk/glibc/patches/glibc-2.15-rintf-rounding.patch
Parent Directory | Revision Log
Revision 1806 -
(show annotations)
(download)
Tue Jun 12 12:33:27 2012 UTC (12 years, 3 months ago) by niro
File size: 6897 byte(s)
Tue Jun 12 12:33:27 2012 UTC (12 years, 3 months ago) by niro
File size: 6897 byte(s)
-added patches for 2.15-r1
1 | diff --git a/math/libm-test.inc b/math/libm-test.inc |
2 | index 6243e1e..c8186c8 100644 |
3 | --- a/math/libm-test.inc |
4 | +++ b/math/libm-test.inc |
5 | @@ -5037,6 +5037,22 @@ rint_test (void) |
6 | TEST_f_f (rint, 262142.75, 262143.0); |
7 | TEST_f_f (rint, 524286.75, 524287.0); |
8 | TEST_f_f (rint, 524288.75, 524289.0); |
9 | + TEST_f_f (rint, 1048576.75, 1048577.0); |
10 | + TEST_f_f (rint, 2097152.75, 2097153.0); |
11 | + TEST_f_f (rint, -1048576.75, -1048577.0); |
12 | + TEST_f_f (rint, -2097152.75, -2097153.0); |
13 | +#ifndef TEST_FLOAT |
14 | + TEST_f_f (rint, 70368744177664.75, 70368744177665.0); |
15 | + TEST_f_f (rint, 140737488355328.75, 140737488355329.0); |
16 | + TEST_f_f (rint, 281474976710656.75, 281474976710657.0); |
17 | + TEST_f_f (rint, 562949953421312.75, 562949953421313.0); |
18 | + TEST_f_f (rint, 1125899906842624.75, 1125899906842625.0); |
19 | + TEST_f_f (rint, -70368744177664.75, -70368744177665.0); |
20 | + TEST_f_f (rint, -140737488355328.75, -140737488355329.0); |
21 | + TEST_f_f (rint, -281474976710656.75, -281474976710657.0); |
22 | + TEST_f_f (rint, -562949953421312.75, -562949953421313.0); |
23 | + TEST_f_f (rint, -1125899906842624.75, -1125899906842625.0); |
24 | +#endif |
25 | #ifdef TEST_LDOUBLE |
26 | /* The result can only be represented in long double. */ |
27 | TEST_f_f (rint, 4503599627370495.5L, 4503599627370496.0L); |
28 | @@ -5137,6 +5153,22 @@ rint_test_tonearest (void) |
29 | TEST_f_f (rint, -0.1, -0.0); |
30 | TEST_f_f (rint, -0.25, -0.0); |
31 | TEST_f_f (rint, -0.625, -1.0); |
32 | + TEST_f_f (rint, 1048576.75, 1048577.0); |
33 | + TEST_f_f (rint, 2097152.75, 2097153.0); |
34 | + TEST_f_f (rint, -1048576.75, -1048577.0); |
35 | + TEST_f_f (rint, -2097152.75, -2097153.0); |
36 | +#ifndef TEST_FLOAT |
37 | + TEST_f_f (rint, 70368744177664.75, 70368744177665.0); |
38 | + TEST_f_f (rint, 140737488355328.75, 140737488355329.0); |
39 | + TEST_f_f (rint, 281474976710656.75, 281474976710657.0); |
40 | + TEST_f_f (rint, 562949953421312.75, 562949953421313.0); |
41 | + TEST_f_f (rint, 1125899906842624.75, 1125899906842625.0); |
42 | + TEST_f_f (rint, -70368744177664.75, -70368744177665.0); |
43 | + TEST_f_f (rint, -140737488355328.75, -140737488355329.0); |
44 | + TEST_f_f (rint, -281474976710656.75, -281474976710657.0); |
45 | + TEST_f_f (rint, -562949953421312.75, -562949953421313.0); |
46 | + TEST_f_f (rint, -1125899906842624.75, -1125899906842625.0); |
47 | +#endif |
48 | #ifdef TEST_LDOUBLE |
49 | /* The result can only be represented in long double. */ |
50 | TEST_f_f (rint, 4503599627370495.5L, 4503599627370496.0L); |
51 | @@ -5207,6 +5239,22 @@ rint_test_towardzero (void) |
52 | TEST_f_f (rint, -0.1, -0.0); |
53 | TEST_f_f (rint, -0.25, -0.0); |
54 | TEST_f_f (rint, -0.625, -0.0); |
55 | + TEST_f_f (rint, 1048576.75, 1048576.0); |
56 | + TEST_f_f (rint, 2097152.75, 2097152.0); |
57 | + TEST_f_f (rint, -1048576.75, -1048576.0); |
58 | + TEST_f_f (rint, -2097152.75, -2097152.0); |
59 | +#ifndef TEST_FLOAT |
60 | + TEST_f_f (rint, 70368744177664.75, 70368744177664.0); |
61 | + TEST_f_f (rint, 140737488355328.75, 140737488355328.0); |
62 | + TEST_f_f (rint, 281474976710656.75, 281474976710656.0); |
63 | + TEST_f_f (rint, 562949953421312.75, 562949953421312.0); |
64 | + TEST_f_f (rint, 1125899906842624.75, 1125899906842624.0); |
65 | + TEST_f_f (rint, -70368744177664.75, -70368744177664.0); |
66 | + TEST_f_f (rint, -140737488355328.75, -140737488355328.0); |
67 | + TEST_f_f (rint, -281474976710656.75, -281474976710656.0); |
68 | + TEST_f_f (rint, -562949953421312.75, -562949953421312.0); |
69 | + TEST_f_f (rint, -1125899906842624.75, -1125899906842624.0); |
70 | +#endif |
71 | #ifdef TEST_LDOUBLE |
72 | /* The result can only be represented in long double. */ |
73 | TEST_f_f (rint, 4503599627370495.5L, 4503599627370495.0L); |
74 | @@ -5277,6 +5325,22 @@ rint_test_downward (void) |
75 | TEST_f_f (rint, -0.1, -1.0); |
76 | TEST_f_f (rint, -0.25, -1.0); |
77 | TEST_f_f (rint, -0.625, -1.0); |
78 | + TEST_f_f (rint, 1048576.75, 1048576.0); |
79 | + TEST_f_f (rint, 2097152.75, 2097152.0); |
80 | + TEST_f_f (rint, -1048576.75, -1048577.0); |
81 | + TEST_f_f (rint, -2097152.75, -2097153.0); |
82 | +#ifndef TEST_FLOAT |
83 | + TEST_f_f (rint, 70368744177664.75, 70368744177664.0); |
84 | + TEST_f_f (rint, 140737488355328.75, 140737488355328.0); |
85 | + TEST_f_f (rint, 281474976710656.75, 281474976710656.0); |
86 | + TEST_f_f (rint, 562949953421312.75, 562949953421312.0); |
87 | + TEST_f_f (rint, 1125899906842624.75, 1125899906842624.0); |
88 | + TEST_f_f (rint, -70368744177664.75, -70368744177665.0); |
89 | + TEST_f_f (rint, -140737488355328.75, -140737488355329.0); |
90 | + TEST_f_f (rint, -281474976710656.75, -281474976710657.0); |
91 | + TEST_f_f (rint, -562949953421312.75, -562949953421313.0); |
92 | + TEST_f_f (rint, -1125899906842624.75, -1125899906842625.0); |
93 | +#endif |
94 | #ifdef TEST_LDOUBLE |
95 | /* The result can only be represented in long double. */ |
96 | TEST_f_f (rint, 4503599627370495.5L, 4503599627370495.0L); |
97 | @@ -5347,6 +5411,22 @@ rint_test_upward (void) |
98 | TEST_f_f (rint, -0.1, -0.0); |
99 | TEST_f_f (rint, -0.25, -0.0); |
100 | TEST_f_f (rint, -0.625, -0.0); |
101 | + TEST_f_f (rint, 1048576.75, 1048577.0); |
102 | + TEST_f_f (rint, 2097152.75, 2097153.0); |
103 | + TEST_f_f (rint, -1048576.75, -1048576.0); |
104 | + TEST_f_f (rint, -2097152.75, -2097152.0); |
105 | +#ifndef TEST_FLOAT |
106 | + TEST_f_f (rint, 70368744177664.75, 70368744177665.0); |
107 | + TEST_f_f (rint, 140737488355328.75, 140737488355329.0); |
108 | + TEST_f_f (rint, 281474976710656.75, 281474976710657.0); |
109 | + TEST_f_f (rint, 562949953421312.75, 562949953421313.0); |
110 | + TEST_f_f (rint, 1125899906842624.75, 1125899906842625.0); |
111 | + TEST_f_f (rint, -70368744177664.75, -70368744177664.0); |
112 | + TEST_f_f (rint, -140737488355328.75, -140737488355328.0); |
113 | + TEST_f_f (rint, -281474976710656.75, -281474976710656.0); |
114 | + TEST_f_f (rint, -562949953421312.75, -562949953421312.0); |
115 | + TEST_f_f (rint, -1125899906842624.75, -1125899906842624.0); |
116 | +#endif |
117 | #ifdef TEST_LDOUBLE |
118 | /* The result can only be represented in long double. */ |
119 | TEST_f_f (rint, 4503599627370495.5L, 4503599627370496.0L); |
120 | diff --git a/sysdeps/ieee754/flt-32/s_rintf.c b/sysdeps/ieee754/flt-32/s_rintf.c |
121 | index 9ea9b6f..9ba6b57 100644 |
122 | --- a/sysdeps/ieee754/flt-32/s_rintf.c |
123 | +++ b/sysdeps/ieee754/flt-32/s_rintf.c |
124 | @@ -26,34 +26,22 @@ float |
125 | __rintf(float x) |
126 | { |
127 | int32_t i0,j0,sx; |
128 | - u_int32_t i,i1; |
129 | float w,t; |
130 | GET_FLOAT_WORD(i0,x); |
131 | sx = (i0>>31)&1; |
132 | j0 = ((i0>>23)&0xff)-0x7f; |
133 | if(j0<23) { |
134 | if(j0<0) { |
135 | - if((i0&0x7fffffff)==0) return x; |
136 | - i1 = (i0&0x07fffff); |
137 | - i0 &= 0xfff00000; |
138 | - i0 |= ((i1|-i1)>>9)&0x400000; |
139 | - SET_FLOAT_WORD(x,i0); |
140 | w = TWO23[sx]+x; |
141 | t = w-TWO23[sx]; |
142 | GET_FLOAT_WORD(i0,t); |
143 | SET_FLOAT_WORD(t,(i0&0x7fffffff)|(sx<<31)); |
144 | return t; |
145 | - } else { |
146 | - i = (0x007fffff)>>j0; |
147 | - if((i0&i)==0) return x; /* x is integral */ |
148 | - i>>=1; |
149 | - if((i0&i)!=0) i0 = (i0&(~i))|((0x100000)>>j0); |
150 | } |
151 | } else { |
152 | if(j0==0x80) return x+x; /* inf or NaN */ |
153 | else return x; /* x is integral */ |
154 | } |
155 | - SET_FLOAT_WORD(x,i0); |
156 | w = TWO23[sx]+x; |
157 | return w-TWO23[sx]; |
158 | } |