MATLAB - 楼层问题

时间:2009-06-26 06:07:29

标签: matlab floating-point precision rounding

我是MATLAB初学者。这是问题所在:

>> a = floor(7/2.5)

a =

      2.00

>> b = rem(7,2.5)

b =

      2.00

>> c = floor(b/2)

c =

         0

c应为1,对吗?为什么是0 ???

如果直接输入b = 2,则不同如下:

>> b = 2

b =

      2.00

>> c = floor(b/2)

c =

      1.00

4 个答案:

答案 0 :(得分:11)

用两个词来表示:截断错误。

你是对的,c在精确算术中应该是1.0。但是,由于你在rem的参数中使用了一个浮点数,你得到了一个浮动的答案。显然,b不是2,而是2.0,这意味着它是一个非常接近2的双倍。因此,b / 2变为双1.0,显然在这种情况下它的值略小于1,给你一个0作为整数值。如果要防止这种情况,请同时使用floor和ceil,并比较值。

如果你想将答案转换为整数,只需使用round而不是floor。

答案 1 :(得分:6)

如果添加行

d = b-a

在您的示例中,您将看到结果

    d =

 -4.4409e-016

意思是Matlab计算了一个接近但不完全是2的数字。这在使用浮点数时会出现相当多的问题。尝试

help eps

了解更多信息。

答案 2 :(得分:2)

此类数字问题也在MATLAB FAQ

中处理

答案 3 :(得分:0)

是的,这是一个数字问题。你应该小心使用这些东西。如果你想要精确算术,你应该为你的数字尝试'sym',例如。

b=rem(sym(7),sym(2.5))

然后你不会有任何这样的错误,但你的计算会慢得多。