about summary refs log tree commit diff
path: root/sysdeps/ieee754/ldbl-128ibm/s_fpclassifyl.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2007-06-08 03:08:45 +0000
committerUlrich Drepper <drepper@redhat.com>2007-06-08 03:08:45 +0000
commit7e3706ea254afe6f4a5f5bf4047d0d9967ce1207 (patch)
treedd2f50353b36cf3dc3c52c5c4aa9e6c3b1c80728 /sysdeps/ieee754/ldbl-128ibm/s_fpclassifyl.c
parent835abc5c0dfd1ba8aabeb52d46793b13702c708b (diff)
downloadglibc-7e3706ea254afe6f4a5f5bf4047d0d9967ce1207.tar.gz
glibc-7e3706ea254afe6f4a5f5bf4047d0d9967ce1207.tar.xz
glibc-7e3706ea254afe6f4a5f5bf4047d0d9967ce1207.zip
* sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c (nextafterl): Remove
	unused ily variable.  Fix nextafterl on +-__LDBL_MAX__ and +-Inf.
	Remove unreachable code at the end.

2007-06-01  Steven Munroe  <sjmunroe@us.ibm.com>

	* sysdeps/ieee754/ldbl-128ibm/s_fpclassifyl.c: Correct description of
	ldbl-128ibm in comment.
	(fpclassifyl): Correct classification of denormals.
	* sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c (nextafterl): Correct
	return value for MIN denormal. Rewrite using long double math too
	correctly handle denormals and canonicalize the results.

2007-06-05  Jakub Jelinek  <jakub@redhat.com>

	* sysdeps/ieee754/ldbl-128ibm/mpn2ldbl.c
	(__mpn_construct_long_double): Fix conversion where result ought
	to be smaller than __LDBL_MIN__, or the low double should be
	denormal.  Fix decision where to negate low double - honor round
	to even rules.
	* stdio-common/tst-sprintf2.c: Include string.h.
	(COMPARE_LDBL): Define.
	(TEST): Also test whether a string hexadecimal float representation
	can be parsed back to the number.
	(main): Add a couple of further tests.

2007-06-04  Jakub Jelinek  <jakub@redhat.com>
Diffstat (limited to 'sysdeps/ieee754/ldbl-128ibm/s_fpclassifyl.c')
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/s_fpclassifyl.c37
1 files changed, 25 insertions, 12 deletions
diff --git a/sysdeps/ieee754/ldbl-128ibm/s_fpclassifyl.c b/sysdeps/ieee754/ldbl-128ibm/s_fpclassifyl.c
index 3ca178a3c5..6999abc250 100644
--- a/sysdeps/ieee754/ldbl-128ibm/s_fpclassifyl.c
+++ b/sysdeps/ieee754/ldbl-128ibm/s_fpclassifyl.c
@@ -1,5 +1,5 @@
 /* Return classification value corresponding to argument.
-   Copyright (C) 1997,1999,2002,2004,2006 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2002,2004,2006,2007 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997 and
    		  Jakub Jelinek <jj@ultra.linux.cz>, 1999.
@@ -30,14 +30,16 @@
    * -NaN	fffn nnnn nnnn nnnn xxxx xxxx xxxx xxxx
    * +Inf	7ff0 0000 0000 0000 xxxx xxxx xxxx xxxx
    * -Inf	fff0 0000 0000 0000 xxxx xxxx xxxx xxxx
-   * +0		0000 0000 0000 0000
-   * -0		8000 0000 0000 0000
-   * +normal	001n nnnn nnnn nnnn (smallest)
-   * -normal	801n nnnn nnnn nnnn (smallest)
-   * +normal	7fen nnnn nnnn nnnn (largest)
-   * -normal	ffen nnnn nnnn nnnn (largest)
-   * +denorm	000n nnnn nnnn nnnn
-   * -denorm	800n nnnn nnnn nnnn
+   * +0		0000 0000 0000 0000 xxxx xxxx xxxx xxxx
+   * -0		8000 0000 0000 0000 xxxx xxxx xxxx xxxx
+   * +normal	0360 0000 0000 0000 0000 0000 0000 0000 (smallest)
+   * -normal	8360 0000 0000 0000 0000 0000 0000 0000 (smallest)
+   * +normal	7fef ffff ffff ffff 7c8f ffff ffff fffe (largest)
+   * +normal	ffef ffff ffff ffff fc8f ffff ffff fffe (largest)
+   * +denorm	0360 0000 0000 0000 8000 0000 0000 0001 (largest)
+   * -denorm	8360 0000 0000 0000 0000 0000 0000 0001 (largest)
+   * +denorm	000n nnnn nnnn nnnn xxxx xxxx xxxx xxxx
+   * -denorm	800n nnnn nnnn nnnn xxxx xxxx xxxx xxxx
    */
 
 int
@@ -59,12 +61,23 @@ ___fpclassifyl (long double x)
       /* +/-zero or +/- normal or +/- denormal */
       if (hx & 0x7fffffffffffffffULL) {
 	  /* +/- normal or +/- denormal */
-	  if ((hx & 0x7ff0000000000000ULL) >= 0x0360000000000000ULL) {
+	  if ((hx & 0x7ff0000000000000ULL) > 0x0360000000000000ULL) {
 	      /* +/- normal */
 	      retval = FP_NORMAL;
 	  } else {
-	      /* +/- denormal */
-	      retval = FP_SUBNORMAL;
+	      if ((hx & 0x7ff0000000000000ULL) == 0x0360000000000000ULL) {
+		  if ((lx & 0x7fffffffffffffff)	/* lower is non-zero */
+		  && ((lx^hx) & 0x8000000000000000ULL)) { /* and sign differs */
+		      /* +/- denormal */
+		      retval = FP_SUBNORMAL;
+		  } else {
+		      /* +/- normal */
+		      retval = FP_NORMAL;
+		  }
+	      } else {
+		  /* +/- denormal */
+		  retval = FP_SUBNORMAL;
+	      }
 	  }
       } else {
 	  /* +/- zero */