changeset 18905:23e511f3395d gui-release

maint: Periodic merge of stable to gui-release.
author John W. Eaton <jwe@octave.org>
date Fri, 27 Jun 2014 17:04:57 -0400
parents 39844e6ccf13 (current diff) 23681c9ea7ba (diff)
children 85d04dfdeac3 eea4f61960d4
files libinterp/corefcn/data.cc
diffstat 2 files changed, 27 insertions(+), 50 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/corefcn/data.cc	Fri Jun 27 17:04:16 2014 -0400
+++ b/libinterp/corefcn/data.cc	Fri Jun 27 17:04:57 2014 -0400
@@ -722,6 +722,8 @@
 %!error rem ([1, 2], [3, 4, 5])
 %!error rem (i, 1)
 
+# bug 42627
+%!assert (rem (0.94, 0.01), 0.0);
 */
 
 DEFALIAS (fmod, rem)
@@ -873,6 +875,9 @@
 ## non-integer real numbers
 %!assert (mod (2.1, 0.1), 0)
 %!assert (mod (2.1, 0.2), 0.1, eps)
+
+# bug 42627
+%!assert (mod (0.94, 0.01), 0.0);
 */
 
 // FIXME: Need to convert reduction functions of this file for single precision
--- a/liboctave/numeric/lo-mappers.h	Fri Jun 27 17:04:16 2014 -0400
+++ b/liboctave/numeric/lo-mappers.h	Fri Jun 27 17:04:57 2014 -0400
@@ -321,33 +321,19 @@
     {
       T q = x / y;
 
-      T n = xfloor (q);
-
-      if (X_NINT (y) != y)
+      if (X_NINT (y) != y
+          && (std::abs ((q - X_NINT (q)) / X_NINT (q))
+              < std::numeric_limits<T>::epsilon ()))
+        retval = 0;
+      else
         {
-          if (X_NINT (q) == q)
-            n = q;
-          else
-            {
-              if (x >= -1 && x <= 1)
-                {
-                  if (std::abs (q - X_NINT (q))
-                      < std::numeric_limits<T>::epsilon ())
-                    n = X_NINT (q);
-                }
-              else
-                {
-                  if (std::abs ((q - X_NINT (q))/ X_NINT (q))
-                      < std::numeric_limits<T>::epsilon ())
-                    n = X_NINT (q);
-                }
-            }
+          T n = xfloor (q);
+
+          // Prevent use of extra precision.
+          volatile T tmp = y * n;
+
+          retval = x - tmp;
         }
-
-      // Prevent use of extra precision.
-      volatile T tmp = y * n;
-
-      retval = x - tmp;
     }
 
   if (x != y && y != 0 && retval != 0)
@@ -368,33 +354,19 @@
     {
       T q = x / y;
 
-      T n = xtrunc (q);
-
-      if (X_NINT (y) != y)
+      if (X_NINT (y) != y
+          && (std::abs ((q - X_NINT (q)) / X_NINT (q))
+              < std::numeric_limits<T>::epsilon ()))
+        retval = 0;
+      else
         {
-          if (X_NINT (q) == q)
-            n = q;
-          else
-            {
-              if (x >= -1 && x <= 1)
-                {
-                  if (std::abs (q - X_NINT (q))
-                      < std::numeric_limits<T>::epsilon ())
-                    n = X_NINT (q);
-                }
-              else
-                {
-                  if (std::abs ((q - X_NINT (q))/ X_NINT (q))
-                      < std::numeric_limits<T>::epsilon ())
-                    n = X_NINT (q);
-                }
-            }
+          T n = xtrunc (q);
+
+          // Prevent use of extra precision.
+          volatile T tmp = y * n;
+
+          retval = x - tmp;
         }
-
-      // Prevent use of extra precision.
-      volatile T tmp = y * n;
-
-      retval = x - tmp;
     }
 
   if (x != y && y != 0 && retval != 0)