Fix %r_simp() about preliminary cleaning 43/21743/6
Samuel GOUGEON [Tue, 27 Apr 2021 08:59:27 +0000 (10:59 +0200)]
 Discussion @ http://mailinglists.scilab.org/Scilab-users-Strange-behaviour-of-prod-on-rationals-tt4040527.html

 1) clean(n) and clean(d) formerly introduced (by me) are not correct
    because they implicitly apply some default absolute threshold.
    Such an absolute threshold is not relevant and even erroneous.
    Indeed, a numerator with all coefficients very small like
    1e-100 + 1e-110*%z  *can* be meaningful. By the way, in a rational,
    (1e-100 + 1e-110*%z)/%z and (1+1e-10*%z)/(1e100*%z) are equivalent.
    So if clean() is used, it should be so with a 0 absolute threshold.

 2) Now for the considered aim, here clean(n,0,reltol) would be useless:
    At least one non-zero coefficient will always survive to it,
    with no way to yield a constant null polynomial.

  This is why these clean() must be removed.
  This does not cancel the fix against the bug 13893, but makes the fix stricter.

  If we want to go forward about simplification with some relevant cleaning,
  this should be done *when operating* (+,-,.*,./) rationals, while
  operands are still known, *not after* based only on the result.
  Indeed, cleaning needs to be based on the order of magnitude of
  *operands coefficients*, compared to the result ones.

  On this respect, https://codereview.scilab.org/21742 is a good preliminary
  that could avoid later implementing N times the same improvements.

Change-Id: I6fef298bc41b6dd1da45dac3aeaa80dda0b798ef

scilab/modules/overloading/macros/%r_simp.sci

index 943f060..edb5b65 100644 (file)
@@ -21,8 +21,8 @@ function h = %r_simp(h, d)
         n = h
         h = []
     end
-    i = find(clean(n)==0 & clean(d)~=0)
     [n, d] = simp(n, d);
+    i = find(n==0 & d~=0)
     d(i) = 1
     h = rlist(n, d, h(4))
 endfunction