为什么计算符号并再次乘以绝对值?

时间:2017-11-08 06:41:09

标签: matlab sign equivalent epsilon

在研究一些MATLAB代码时,我发现了这个(简化版)

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

但这对我没有意义。与下面的代码有什么区别?

tol=1.e-4
is=is*tol/eps

即使我没有MATLAB,操作看起来也很简单,并且不会有任何混淆。但是,我也确信作者意味着什么。

你知道吗?

1 个答案:

答案 0 :(得分:2)

让我们创建一个简单的“单元测试”:

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

哪个输出:

s = sign(is) ... s*abs(is)

因此,第一个结论是代码对于常见场景(在数值误差范围内)是等效的。

至于为什么这样做 - 我只能推测{{1}}是某种方式来处理复杂数字的sign输出(没有意识到它可以用更简单的方式完成)