]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix ldbl-96 hypotl of subnormals (bug 15529).
authorJoseph Myers <joseph@codesourcery.com>
Fri, 24 May 2013 20:52:55 +0000 (20:52 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Fri, 24 May 2013 20:52:55 +0000 (20:52 +0000)
ChangeLog
NEWS
math/libm-test.inc
sysdeps/ieee754/ldbl-96/e_hypotl.c

index bddd4d5698427b5ad6e0088d858f400be40d8548..6c5111c79219f322e87afe61557a6d0415fbc6da 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2013-05-24  Joseph Myers  <joseph@codesourcery.com>
 
+       [BZ #15529]
+       * sysdeps/ieee754/ldbl-96/e_hypotl.c (__ieee754_hypotl): Set high
+       bit of mantissa of 2^16382.
+       * math/libm-test.inc (hypot_test_data): Add more tests.
+
        * math/libm-test.inc: Add drem and pow10 to list of tested
        functions.
        (pow10_test): New function.
diff --git a/NEWS b/NEWS
index a9377eb5ffa3590abbe158c0fc0f3acf0bdb7259..c25b62ee4cfe65f83fc823f7f9db9ad024fb7fc9 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -18,7 +18,8 @@ Version 2.18
   15287, 15304, 15305, 15307, 15309, 15327, 15330, 15335, 15336, 15337,
   15339, 15342, 15346, 15359, 15361, 15366, 15380, 15381, 15394, 15395,
   15405, 15406, 15409, 15416, 15418, 15419, 15423, 15424, 15426, 15429,
-  15441, 15442, 15448, 15480, 15485, 15488, 15490, 15493, 15497, 15506.
+  15441, 15442, 15448, 15480, 15485, 15488, 15490, 15493, 15497, 15506,
+  15529.
 
 * CVE-2013-0242 Buffer overrun in regexp matcher has been fixed (Bugzilla
   #15078).
index 91af668e9493f565bb64acdcf863a509d1e6763c..7a6bf09a66f0f3cd9cec983da64cf69dfddb8384 100644 (file)
@@ -9386,6 +9386,19 @@ static const struct test_ff_f_data hypot_test_data[] =
 
 #if defined TEST_LDOUBLE && LDBL_MAX_EXP >= 16384 && !defined TEST_INLINE
     TEST_ff_f (hypot, 0x3p16381L, 0x4p16381L, 0x5p16381L),
+#endif
+
+    TEST_ff_f (hypot, 0x1p-149L, 0x1p-149L, 1.9817352931807469938024533350782879785095e-45L, UNDERFLOW_EXCEPTION_FLOAT),
+
+#ifndef TEST_FLOAT
+    TEST_ff_f (hypot, 0x1p-1074L, 0x1p-1074L, 6.9871433705131320800651344656990806305791e-324L, UNDERFLOW_EXCEPTION_DOUBLE),
+#endif
+
+#if defined TEST_LDOUBLE && LDBL_MIN_EXP <= -16381 && !defined TEST_INLINE
+    TEST_ff_f (hypot, 0x1p-16445L, 0x1p-16445L, 5.1550906155442528702558159159596215039925e-4951L, UNDERFLOW_EXCEPTION),
+# if LDBL_MANT_DIG >= 113
+    TEST_ff_f (hypot, 0x1p-16494L, 0x1p-16494L, 9.1572804726500807075521065242888978445857e-4966L, UNDERFLOW_EXCEPTION),
+# endif
 #endif
   };
 
index 306f92924c30f51613131aeab9bb5c42f19eab1b..78954888489a6cb9ac42cff04e61c1a75ffdc685 100644 (file)
@@ -85,7 +85,7 @@ long double __ieee754_hypotl(long double x, long double y)
                u_int32_t high,low;
                GET_LDOUBLE_WORDS(exp,high,low,b);
                if((high|low)==0) return a;
-               SET_LDOUBLE_WORDS(t1, 0x7ffd, 0, 0);    /* t1=2^16382 */
+               SET_LDOUBLE_WORDS(t1, 0x7ffd, 0x80000000, 0); /* t1=2^16382 */
                b *= t1;
                a *= t1;
                k -= 16382;