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)