Hello,

To me, as already claimed there <https://bugzilla.scilab.org/show_bug.cgi?id=15781#c2>, it's clear that, for a complex-encoded number, not displaying its null imaginary part is a bug, and the proposed patch is clearly welcome as well.

Another regression very close to this one, but with real numbers display, would deserve the same care :
Scilab 5:
-->[1e30 1e-30]
 ans  =
    1.000D+30    1.000D-30

Scilab 6:
--> [1e30 1e-30]
 ans  =
   1.000D+30   0.

So, very small numbers are reduced to strict 0...
This is a bad implementation of the variable format mode. The Scilab 5 one was correct, at least on this point.

Best regards
Samuel


Le 12/09/2019 à 10:26, Stéphane Mottelet a écrit :
Hello all,

The subject has been already discussed a lot but I would like it to be discussed again because I now have a real rationale to promote a change in the way complex numbers with small imaginary part are displayed.

I don't know if some of you were aware of the clever technique of complex-step derivative approximation, but until yesterday I was not (see e.g. http://mdolab.engin.umich.edu/sites/default/files/Martins2003CSD.pdf). Roughly speaking, using the extension of a real function x->f(x) to the complex plane allows to compute an approximation of the derivative f'(x0) at a real x0 without using a substraction, like in the central difference formula (f(x0+h)-f(x0-h))/2/h which is subject to substractive cancelation when h is small. In Scilab most operators and elementary functions are already complex-aware so this is easy to illustrate the technique. For example let us approximate the derivative of x->cos(x) at x=%pi/4, first with the central difference formula, then with the complex step technique:

--> format("e",24)

--> h=%eps/128, x0=%pi/4
 h  =

   1.73472347597680709D-18

 x0  =

   7.85398163397448279D-01


--> (cos(x0+h)-cos(x0-h))/2/h
 ans  =

   0.00000000000000000D+00


--> imag(cos(x0+%i*h))/h
 ans  =

  -7.07106781186547462D-01


--> -sin(x0)
 ans  =

  -7.07106781186547462D-01

You can see the pathological approximation with central difference formula and the perfect (up to relative machine precision) approximation of complex-step formula.

However, the following is a pity:


--> cos(x0+%i*h)
 ans  =

   7.07106781186547573D-01

We cannot see the imaginary part although seeing the latter is fundamental in the complex-step technique. We have to force the display like this, and frankly I don't like having to do that with my students:

--> imag(cos(x0+%i*h))
 ans  =

  -1.22663473334669916D-18

I hope that you will find that this example is a good rationale to change the default display of Scilab. To feed the discussion, here is how Matlab displays things, without having to change the default settings:


>> h=eps/128, x0=pi/4
h =
   1.7347e-18
x0 =
    0.7854

>> (cos(x0+h)-cos(x0-h))/2/h
ans =
     0

>> cos(x0+i*h)
ans =
   0.7071 - 0.0000i

>> imag(cos(x0+i*h))/h
ans =
   -0.7071

>> -sin(x0)
ans =
   -0.7071



_______________________________________________
users mailing list
users@lists.scilab.org
http://lists.scilab.org/mailman/listinfo/users

Reply via email to