Mercurial > hg > octave-nkf
diff liboctave/numeric/lo-mappers.h @ 19059:23681c9ea7ba stable
better guess if rem or mod could be zero (bug #42627)
* lo-mappers.h (xmod, xrem): Don't treat abs(x)<=1 specially.
Return 0 if x/y is assumed an integer.
* data.cc: New tests for rem and mod.
author | Olaf Till <i7tiol@t-online.de> |
---|---|
date | Fri, 27 Jun 2014 11:49:22 +0200 |
parents | ebb3ef964372 |
children | 5b263e517c95 |
line wrap: on
line diff
--- a/liboctave/numeric/lo-mappers.h +++ b/liboctave/numeric/lo-mappers.h @@ -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)