【问题标题】:Matlab division by 0: Inf or -InfMatlab除以0:Inf或-Inf
【发布时间】:2017-04-13 20:33:01
【问题描述】:

我无法弄清楚为什么在以下两种情况下除以 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

这怎么可能?为什么?是否有某种隐藏的“标志”?

【问题讨论】:

标签: matlab division infinite zero divide-by-zero


【解决方案1】:

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 的每个元素,sign(X) 如果元素返回 1 大于零,如果等于零则为 0,如果等于则 -1 小于零

由于-0 不小于零,而是等于0,所以sign 返回0

【讨论】:

  • 我明白了——这很有用。任何猜测为什么符号位设置为零呢?在执行amort 要求的计算时,它是否取决于机器精度/近似值?我可以预防这些情况吗?
  • @Giuseppe:在您的示例中的 amort 函数中,最后一个向量元素的分子为 0,但分母为 (1-1.03^20),或大约 -0.8061。将 0 除以负数会得到 -0。如果你交换分子和分母中的术语(即在顶部和底部乘以 -1),你可以避免它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-20
  • 1970-01-01
  • 2020-06-14
  • 2016-08-23
  • 2016-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多