Let's create a simple "unit test":
function q47173141
TOL = 1E-4;
% Positive:
num = 3;
evalAndPrintBoth(num);
% Negative:
num = -2;
evalAndPrintBoth(num);
% Zero:
num = 0;
evalAndPrintBoth(num);
% Complex:
num = 1+1i;
evalAndPrintBoth(num);
% Imaginary 1:
num = 0.2i;
evalAndPrintBoth(num);
% Imaginary 2:
num = -2i;
evalAndPrintBoth(num);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function evalAndPrintBoth(num)
disp('------------------------');
disp(num2str(num));
disp(num2str(orig(num)));
disp(num2str(shortfun(num)));
end
function out = orig(is)
s=sign(is); if(s==0), s=1; end
out = s*abs(is)*TOL/eps;
end
function out = shortfun(is)
out = is*TOL/eps;
end
end
Which outputs:
>> q47173141
------------------------
3
1351079888211.149
1351079888211.149
------------------------
-2
-900719925474.0992
-900719925474.0992
------------------------
0
0
0
------------------------
1+1i
450359962737.0496+450359962737.0496i
450359962737.0496+450359962737.0496i
------------------------
0+0.2i
0+90071992547.4099i
0+90071992547.4099i
------------------------
0-2i
0-900719925474.0992i
0-900719925474.0992i
So the first conclusion is that the codes are equivalent for common scenarios (within numerical error).
As to why it was done that way - I can only speculate that s = sign(is) ... s*abs(is)
was some way to treat sign
's output for complex numbers (without realizing it could be done in a simpler way).