[Scilab-users] Fix of bug #4953 (behavior of clean() with %inf)

classic Classic list List threaded Threaded
2 messages Options
mottelet mottelet
Reply | Threaded
Open this post in threaded view
|

[Scilab-users] Fix of bug #4953 (behavior of clean() with %inf)

Hello all,

A fix proposal is under review @
https://codereview.scilab.org/#/c/20204/2, in order to consider the
actual behavior of clean() when the argument has some infinite values:

In Scilab 6.0.1:


--> clean([%inf 1])
  ans  =

    0.   0.

By a argument of continuity, since

--> clean([1.79e308 1])
  ans  =

    1.79D+308   0.

the fixed behavior would be

--> clean([%inf 1])
  ans  =

    Inf   0.

Please give your opinion if you feel concerned.

S.

--
Stéphane Mottelet
Ingénieur de recherche
EA 4297 Transformations Intégrées de la Matière Renouvelable
Département Génie des Procédés Industriels
Sorbonne Universités - Université de Technologie de Compiègne
CS 60319, 60203 Compiègne cedex
Tel : +33(0)344234688
http://www.utc.fr/~mottelet

_______________________________________________
users mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users
Samuel GOUGEON Samuel GOUGEON
Reply | Threaded
Open this post in threaded view
|

Re: Fix of bug #4953 (behavior of clean() with %inf)

Hello,

Le 28/06/2018 à 17:41, Stéphane Mottelet a écrit :
Hello all,

A fix proposal is under review @ https://codereview.scilab.org/#/c/20204/2, in order to consider the actual behavior of clean() when the argument has some infinite values:

In Scilab 6.0.1:


--> clean([%inf 1])
 ans  =

   0.   0.

By a argument of continuity, since

--> clean([1.79e308 1])
 ans  =

   1.79D+308   0.

the fixed behavior would be

--> clean([%inf 1])
 ans  =

   Inf   0.

Please give your opinion if you feel concerned.


IMO, setting to  zero all finite values of an array as soon as one of them is %inf is abusive and counter-productive.
Let
--> A = 10.^grand(4,4,"unf",-10,5); A(2,2) = %inf;
 A  =
   4.3699094   0.0000014   0.67061     6.095D-09
   6503.1214   Inf         4.5767598   0.0006926
   20.907407   1.5687011   2.749D-08   0.0029886
   129.70759   1.102D-10   0.4564722   40.621591

The proposed implementation would lead to

--> clean(A)    //  A(abs(A)~=%inf & A==A)=0
 ans  =
   0.   0.    0.   0.
   0.   Inf   0.   0.
   0.   0.    0.   0.
   0.   0.    0.   0.

With that, no more processing or linear algebra can be done, just getting exclusively some zeros, %inf, and Nan.
The same can be done with A(abs(A)~=%inf) = 0. This is a poor and stopping result.

Instead, cleaning values with respect to the max |finite| one will yield

 --> clean(A)     // B = A; A(abs(A)<max(A(abs(A)<%inf))*1e-10)=0
 A  =
   4.3699094   0.0000014   0.67061     0.      
   6503.1214   Inf         4.5767598   0.0006926
   20.907407   1.5687011   0.          0.0029886
   129.70759   0.          0.4564722   40.621591

This result is a way richer. It still allows to work with it.

By the way, there is no continuity from 1.79D+308 to %inf
An array may have all its |values| around and below the max 1.79D+308 by some small factors, then arithmetic can still be possible with them, and %inf will still be a special value with a special processing.

This is why i do not agree with the proposed clean() update.

Best regards
Samuel



_______________________________________________
users mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users