This is the mail archive of the
glibc-cvs@sourceware.org
mailing list for the glibc project.
GNU C Library master sources branch, master, updated. glibc-2.15-367-g7c10fd3
- From: davem at sourceware dot org
- To: glibc-cvs at sourceware dot org
- Date: 14 Mar 2012 01:09:13 -0000
- Subject: GNU C Library master sources branch, master, updated. glibc-2.15-367-g7c10fd3
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".
The branch, master has been updated
via 7c10fd3515f983ca732b2166ccffebbf83603f1f (commit)
from f453b98b6bf698ddb4d49cd3dc0f94d2da2a8968 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://sources.redhat.com/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=7c10fd3515f983ca732b2166ccffebbf83603f1f
commit 7c10fd3515f983ca732b2166ccffebbf83603f1f
Author: David S. Miller <davem@davemloft.net>
Date: Tue Mar 13 18:08:58 2012 -0700
Fix hypotf overflow/underflow by using double precision instead of scaling.
[BZ #13840]
* sysdeps/ieee754/flt-32/e_hypotf.c (__ieee754_hypotf): Rewrite to use
double-precision for the calculation instead of scaling.
diff --git a/ChangeLog b/ChangeLog
index b8f1fe5..b65f68a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2012-03-13 David S. Miller <davem@davemloft.net>
+
+ [BZ #13840]
+ * sysdeps/ieee754/flt-32/e_hypotf.c (__ieee754_hypotf): Rewrite to use
+ double-precision for the calculation instead of scaling.
+
2012-03-13 Joseph Myers <joseph@codesourcery.com>
* sysdeps/ieee754/dbl-64/s_nearbyint.c (__nearbyint): Do not
diff --git a/sysdeps/ieee754/flt-32/e_hypotf.c b/sysdeps/ieee754/flt-32/e_hypotf.c
index 97e7d34..8f499b5 100644
--- a/sysdeps/ieee754/flt-32/e_hypotf.c
+++ b/sysdeps/ieee754/flt-32/e_hypotf.c
@@ -19,62 +19,35 @@
float
__ieee754_hypotf(float x, float y)
{
- float a,b,t1,t2,y1,y2,w;
- int32_t j,k,ha,hb;
+ double d_x, d_y;
+ int32_t ha, hb;
GET_FLOAT_WORD(ha,x);
ha &= 0x7fffffff;
GET_FLOAT_WORD(hb,y);
hb &= 0x7fffffff;
- if(hb > ha) {a=y;b=x;j=ha; ha=hb;hb=j;} else {a=x;b=y;}
- SET_FLOAT_WORD(a,ha); /* a <- |a| */
- SET_FLOAT_WORD(b,hb); /* b <- |b| */
- if((ha-hb)>0xf000000) {return a+b;} /* x/y > 2**30 */
- k=0;
- if(__builtin_expect(ha > 0x58800000, 0)) { /* a>2**50 */
- if(ha >= 0x7f800000) { /* Inf or NaN */
- w = a+b; /* for sNaN */
- if(ha == 0x7f800000) w = a;
- if(hb == 0x7f800000) w = b;
- return w;
- }
- /* scale a and b by 2**-60 */
- ha -= 0x1e000000; hb -= 0x1e000000; k += 60;
- SET_FLOAT_WORD(a,ha);
- SET_FLOAT_WORD(b,hb);
- }
- if(__builtin_expect(hb < 0x26800000, 0)) { /* b < 2**-50 */
- if(hb <= 0x007fffff) { /* subnormal b or 0 */
- if(hb==0) return a;
- SET_FLOAT_WORD(t1,0x7e800000); /* t1=2^126 */
- b *= t1;
- a *= t1;
- k -= 126;
- } else { /* scale a and b by 2^60 */
- ha += 0x1e000000; /* a *= 2^60 */
- hb += 0x1e000000; /* b *= 2^60 */
- k -= 60;
- SET_FLOAT_WORD(a,ha);
- SET_FLOAT_WORD(b,hb);
- }
- }
- /* medium size a and b */
- w = a-b;
- if (w>b) {
- SET_FLOAT_WORD(t1,ha&0xfffff000);
- t2 = a-t1;
- w = __ieee754_sqrtf(t1*t1-(b*(-b)-t2*(a+t1)));
- } else {
- a = a+a;
- SET_FLOAT_WORD(y1,hb&0xfffff000);
- y2 = b - y1;
- SET_FLOAT_WORD(t1,ha+0x00800000);
- t2 = a - t1;
- w = __ieee754_sqrtf(t1*y1-(w*(-w)-(t1*y2+t2*b)));
- }
- if(k!=0) {
- SET_FLOAT_WORD(t1,0x3f800000+(k<<23));
- return t1*w;
- } else return w;
+ if (ha == 0x7f800000)
+ {
+ if (x == y)
+ return fabsf(y);
+ return fabsf(x);
+ }
+ else if (hb == 0x7f800000)
+ {
+ if (x == y)
+ return fabsf(x);
+ return fabsf(y);
+ }
+ else if (ha > 0x7f800000 || hb > 0x7f800000)
+ return fabsf(x) * fabsf(y);
+ else if (ha == 0)
+ return fabsf(y);
+ else if (hb == 0)
+ return fabsf(x);
+
+ d_x = (double) x;
+ d_y = (double) y;
+
+ return (float) __ieee754_sqrt(d_x * d_x + d_y * d_y);
}
strong_alias (__ieee754_hypotf, __hypotf_finite)
-----------------------------------------------------------------------
Summary of changes:
ChangeLog | 6 +++
sysdeps/ieee754/flt-32/e_hypotf.c | 77 ++++++++++++-------------------------
2 files changed, 31 insertions(+), 52 deletions(-)
hooks/post-receive
--
GNU C Library master sources