Giu*_*ppe 3 matlab division infinite zero divide-by-zero
我无法弄清楚为什么除以0会在以下两种情况下给出不同的结果.
amort是一个计算常量摊销计划的函数.我们现在唯一关心的是A的最后一个元素正好是0.
amort = @(r,M) ((1+r).^(0:M)' - (1+r).^M) ./ (1-(1+r).^M)
A = amort(0.03, 20);
>> A(end)==0
ans =
1
Run Code Online (Sandbox Code Playgroud)
看起来很奇怪的是:
>> 1/0
ans =
Inf
>> 1/A(end)
ans =
-Inf
Run Code Online (Sandbox Code Playgroud)
然而
>> sign(A(end))
ans =
0
>> 1/abs(A(end))
ans =
Inf
Run Code Online (Sandbox Code Playgroud)
这怎么可能,为什么?有某种隐藏的"标志"吗?
A(end)实际上有它的符号位设置(即它是负零).尝试使用num2hex以查看十六进制表示:
>> a = -0
a =
0 % Note the sign isn't displayed
>> num2hex(A(end))
ans =
8000000000000000
>> num2hex(a)
ans =
8000000000000000 % Same as above
>> num2hex(0)
ans =
0000000000000000 % All zeroes
>> 1/a
ans =
-Inf
Run Code Online (Sandbox Code Playgroud)
请注意,a -0显示为0,但实际上已设置其符号位.因此-Inf结果.
还要注意这个sign功能的解释(强调我的):
对于X的每个元素,如果元素大于零,则sign(X)返回1,如果它等于零,则返回0,如果小于零,则返回-1.
因为-0不小于零,而是等于0,sign返回0.