* math/test-misc.c (main): Add tests for rounding long double
authorJakub Jelinek <jakub@redhat.com>
Thu, 3 May 2007 12:15:04 +0000 (12:15 +0000)
committerJakub Jelinek <jakub@redhat.com>
Thu, 3 May 2007 12:15:04 +0000 (12:15 +0000)
values close to smallest double denormalized value to double.
* soft-fp/op-common.h (FP_TRUNC): Correct off-by-one error in
condition for truncating to 0.  Set sticky bit for such
truncation.
2007-05-03  Jakub Jelinek  <jakub@redhat.com>

* math/test-misc.c (main): Add tests for rounding long double
values close to smallest double denormalized value to double.

2007-04-30  Joseph Myers  <joseph@codesourcery.com>

* soft-fp/op-common.h (FP_TRUNC): Correct off-by-one error in
condition for truncating to 0.  Set sticky bit for such
truncation.

ChangeLog
math/test-misc.c
soft-fp/op-common.h

index 6529087..d77d784 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2007-05-03  Jakub Jelinek  <jakub@redhat.com>
+
+       * math/test-misc.c (main): Add tests for rounding long double
+       values close to smallest double denormalized value to double.
+
+2007-04-30  Joseph Myers  <joseph@codesourcery.com>
+
+       * soft-fp/op-common.h (FP_TRUNC): Correct off-by-one error in
+       condition for truncating to 0.  Set sticky bit for such
+       truncation.
+
 2007-05-02  Jakub Jelinek  <jakub@redhat.com>
 
        * stdio-common/vfprintf.c (process_string_arg): Use a VLA rather than
index 862e11f..1dc4d90 100644 (file)
@@ -1235,5 +1235,22 @@ main (void)
     }
 #endif
 
+#if !defined NO_LONG_DOUBLE && LDBL_MANT_DIG >= DBL_MANT_DIG + 4
+  volatile long double ld5 = nextafter (0.0, 1.0) / 16.0L;
+  volatile double d5;
+  (void) &ld5;
+  int i;
+  for (i = 0; i <= 32; i++)
+    {
+      d5 = ld5 * i;
+      (void) &d5;
+      if (d5 != (i <= 8 ? 0 : i < 24 ? 1 : 2) * nextafter (0.0, 1.0))
+       {
+         printf ("%La incorrectly rounded to %a\n", ld5 * i, d5);
+         result = 1;
+       }
+    } 
+#endif
+
   return result;
 }
index 0aa6e3e..1f58b89 100644 (file)
@@ -1211,8 +1211,11 @@ do {                                                                          \
        {                                                                    \
          if (D##_e <= 0)                                                    \
            {                                                                \
-             if (D##_e <= 1 - _FP_FRACBITS_##dfs)                           \
-               _FP_FRAC_SET_##swc(S, _FP_ZEROFRAC_##swc);                   \
+             if (D##_e < 1 - _FP_FRACBITS_##dfs)                            \
+               {                                                            \
+                 _FP_FRAC_SET_##swc(S, _FP_ZEROFRAC_##swc);                 \
+                 _FP_FRAC_LOW_##swc(S) |= 1;                                \
+               }                                                            \
              else                                                           \
                {                                                            \
                  _FP_FRAC_HIGH_##sfs(S) |= _FP_IMPLBIT_SH_##sfs;            \