Nehmen sich einen einfachen "Unit-Test" erstellen:
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
Welche Ausgänge:
>> 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 ist die erste Schlussfolgerung ist, dass die Codes für allgemeine Szenarien gleichwertig sind (in numerischem Fehler).
Warum es so gemacht wurde - ich kann nur spekulieren, dass s = sign(is) ... s*abs(is)
war eine Möglichkeit, sign
's Ausgabe für komplexe Zahlen zu behandeln (ohne zu merken, dass es auf eine einfachere Weise getan werden konnte).
wird 's' irgendwo anders im Code verwendet? – anyanwu
@ammportal - s wird nicht woanders verwendet. – Heungson
Dann sehe ich keinen Grund, den komplexen Code zu verwenden. Der Code, den Sie gemacht haben, sollte funktionieren – anyanwu