MATLAB - 楼层问题

8 floating-point precision matlab rounding

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

>> a = floor(7/2.5)

a =

      2.00

>> b = rem(7,2.5)

b =

      2.00

>> c = floor(b/2)

c =

         0
Run Code Online (Sandbox Code Playgroud)

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

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

>> b = 2

b =

      2.00

>> c = floor(b/2)

c =

      1.00
Run Code Online (Sandbox Code Playgroud)

Mar*_*ijn 11

用两个词来说:截断错误.

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

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

  • 小心使用"转换为整数"术语:round不会转换为整数类型,而是返回最接近的整数值,仍然是double.这通常是你想要的.像int32这样的实际Matlab整数类型的优先级高于double,并且会导致对它们的所有后续操作都使用整数运算. (2认同)

mtr*_*trw 6

如果添加该行

d = b-a
Run Code Online (Sandbox Code Playgroud)

在你的例子中,你会看到结果

    d =

 -4.4409e-016
Run Code Online (Sandbox Code Playgroud)

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

help eps
Run Code Online (Sandbox Code Playgroud)

欲获得更多信息.