我无法弄清楚为什么在以下两种情况下进行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
看起来很奇怪的是:
>> 1/0
ans =
Inf
>> 1/A(end)
ans =
-Inf
但是
>> sign(A(end))
ans =
0
>> 1/abs(A(end))
ans =
Inf
这是怎么可能的,为什么?有某种隐藏的"标志"?
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
请注意,-0
显示为0
,但实际上具有符号位。因此-Inf
结果。
还请注意sign
功能(重点矿山)的这种说明:
对于x的每个元素,符号(x)如果元素返回1 大于零,如果等于零,则0等于0 小于零。
由于-0
不小于零,而是等于0
,sign
返回0
。