Matlab地板虫?

Boe*_*ern 2 floating-point precision matlab rounding

我想我在Matlab中发现了一个错误.我唯一的解释是,matlab内部计算的值不是显示的值:

K>> calc(1,11)

ans =

   4.000000000000000

K>> floor(ans)

ans =

     3
Run Code Online (Sandbox Code Playgroud)

显示的代码是Matlab控制台的输出.calc(x,y)只是一个double值数组.

小智 8

MATLAB使用标准的IEEE浮点形式来存储double.

看看如果我们从4中减去一小部分,MATLAB仍会在结果中显示4.

>> format long g
>> 4 - eps(2)
ans =
                         4
Run Code Online (Sandbox Code Playgroud)

实际上,MATLAB以二进制形式存储数字.我们可以看到该数字的十进制版本:

>> sprintf('%.55f',4-eps(2))
ans =
3.9999999999999995559107901499373838305473327636718750000
Run Code Online (Sandbox Code Playgroud)

很明显,MATLAB不应该显示整个数字的混乱,但通过将结果四舍五入到15位,我们得到4为显示.

很明显,calc(1,11)中的值是这样一个数字,内部表示为小于4,只是头发太小而不能显示为4,但它不是4.

永远不要相信浮点运算中结果的最低显示数字.

编辑:

你似乎认为MATLAB中的3.999999999999999应该小于4.逻辑上,这是有道理的.但是当你提供这个号码时会发生什么?是的,浮点数double的粒度大于此值.MATLAB不能将它表示为小于4的数字.它在内部将该数字向上舍入为完全4.

>> sprintf('%.55f',3.9999999999999999)
ans =
4.0000000000000000000000000000000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)