我是 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
我是 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
简而言之:截断错误。
你是对的,c 在精确算术中应该是 1.0。但是,由于您在 rem 的参数中使用了浮点数,因此您得到的答案是浮点数。显然,b 不完全是 2,而是 2.0,这意味着它是一个非常接近 2 的双精度数。因此,b/2 变成双精度数 1.0,显然在这种情况下它的值略小于 1,给你一个 0 作为整数值。如果要防止这种情况,请同时使用 floor 和 ceil,并比较这些值。
如果要将答案转换为整数,只需使用 round 而不是 floor。
如果您添加该行
d = b-a
对于您的示例,您将看到结果
d =
-4.4409e-016
这意味着 Matlab 为 b 计算了一个接近但不完全是 2 的数字。这在处理浮点数时会出现很多情况。尝试
help eps
了解更多信息。
MATLAB 常见问题解答中也处理了此类数值问题
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.