about summary refs log tree commit diff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2007-10-28 01:14:40 +0000
committerUlrich Drepper <drepper@redhat.com>2007-10-28 01:14:40 +0000
commite6b29af8a314d3a6a538222a98383c215d410ddf (patch)
treee34c007df61a87e144b4d34b92e0bfdb14ae5d76
parentad3371fbac6896adc4820434676f35bd44a24cf8 (diff)
downloadglibc-e6b29af8a314d3a6a538222a98383c215d410ddf.tar.gz
glibc-e6b29af8a314d3a6a538222a98383c215d410ddf.tar.xz
glibc-e6b29af8a314d3a6a538222a98383c215d410ddf.zip
[BZ #2549]
2006-04-14  H.J. Lu  <hongjiu.lu@intel.com>
	[BZ #2549]
	* math/libm-test.inc (check_float_internal): Support
	denormalized return.
-rw-r--r--ChangeLog6
-rw-r--r--math/libm-test.inc23
2 files changed, 24 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index c61158200b..91942faaab 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2006-04-14  H.J. Lu  <hongjiu.lu@intel.com>
+
+	[BZ #2549]
+	* math/libm-test.inc (check_float_internal): Support
+	denormalized return.
+
 2007-10-23  Andreas Jaeger  <aj@suse.de>
 
 	[BZ #5208]
diff --git a/math/libm-test.inc b/math/libm-test.inc
index da68d40bb4..e698923f4e 100644
--- a/math/libm-test.inc
+++ b/math/libm-test.inc
@@ -487,11 +487,24 @@ check_float_internal (const char *test_name, FLOAT computed, FLOAT expected,
   else
     {
       diff = FUNC(fabs) (computed - expected);
-      /* ilogb (0) isn't allowed.  */
-      if (expected == 0.0)
-	ulp = diff / FUNC(ldexp) (1.0, - MANT_DIG);
-      else
-	ulp = diff / FUNC(ldexp) (1.0, FUNC(ilogb) (expected) - MANT_DIG);
+      switch (fpclassify (expected))
+	{
+	case FP_ZERO:
+	  /* ilogb (0) isn't allowed. */
+	  ulp = diff / FUNC(ldexp) (1.0, - MANT_DIG);
+	  break;
+	case FP_NORMAL:
+	  ulp = diff / FUNC(ldexp) (1.0, FUNC(ilogb) (expected) - MANT_DIG);
+	  break;
+	case FP_SUBNORMAL:
+	  ulp = (FUNC(ldexp) (diff, MANT_DIG)
+		 / FUNC(ldexp) (1.0, FUNC(ilogb) (expected)));
+	  break;
+	default:
+	  /* It should never happen. */
+	  abort ();
+	  break;
+	}
       set_max_error (ulp, curr_max_error);
       print_diff = 1;
       if ((exceptions & IGNORE_ZERO_INF_SIGN) == 0