2017-11-08 5 views
0

Während in einigen MATLAB-Code suchen, fand ich diese (vereinfachte Version)Warum das Vorzeichen berechnen und erneut mit dem absoluten Wert multiplizieren?

is = 1.414 % just any floating point value 
tol=1.e-4 
s=sign(is); if(s==0), s=1; end; 
is=s*abs(is)*tol/eps 

Aber es macht keinen Sinn für mich. Was ist der Unterschied zum folgenden Code?

Obwohl ich MATLAB nicht habe, scheint die Operation ziemlich einfach zu sein, und es würde keine Verwirrung geben. Aber ich bin mir auch sicher, dass der Autor etwas gemeint hat.

Haben Sie eine Idee?

+0

wird 's' irgendwo anders im Code verwendet? – anyanwu

+0

@ammportal - s wird nicht woanders verwendet. – Heungson

+0

Dann sehe ich keinen Grund, den komplexen Code zu verwenden. Der Code, den Sie gemacht haben, sollte funktionieren – anyanwu

Antwort

2

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).

+0

Sorry für die späte Antwort und danke für die Mühe. Ich sehe immer noch keinen Vorteil. Vielleicht ist es einfach, dass der Autor es versehentlich nach dem Löschen anderer Zeilen dort gelassen hat. – Heungson

Verwandte Themen