我是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
答案 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))
然后你不会有任何这样的错误,但你的计算会慢得多。