8

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

4 回答 4

11

简而言之:截断错误。

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

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

于 2009-06-26T06:31:35.327 回答
6

如果您添加该行

d = b-a

对于您的示例,您将看到结果

    d =

 -4.4409e-016

这意味着 Matlab 为 b 计算了一个接近但不完全是 2 的数字。这在处理浮点数时会出现很多情况。尝试

help eps

了解更多信息。

于 2009-06-26T07:09:07.863 回答
2

MATLAB 常见问题解答中也处理了此类数值问题

于 2009-06-26T10:50:58.773 回答
0

Yeah that is a numerical issue. You should use such things with care. If you want exact arithmetic , you should try 'sym' for your number e.g.

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

Then you will not any such errors, but your computations will be much slower.

于 2012-03-30T12:12:30.647 回答