<分区>
我想我在 Matlab 中发现了一个错误。我唯一的解释是,matlab 在内部使用显示的值以外的其他值进行计算:
K>> calc(1,11)
ans =
4.000000000000000
K>> floor(ans)
ans =
3
显示的代码是 Matlab 控制台的输出。 calc(x,y) 只是一个 double 值数组。
<分区>
我想我在 Matlab 中发现了一个错误。我唯一的解释是,matlab 在内部使用显示的值以外的其他值进行计算:
K>> calc(1,11)
ans =
4.000000000000000
K>> floor(ans)
ans =
3
显示的代码是 Matlab 控制台的输出。 calc(x,y) 只是一个 double 值数组。
最佳答案
MATLAB 使用标准 IEEE 浮点形式来存储 double 值。
请注意,如果我们从 4 中减去一小部分,MATLAB 仍会显示 4 作为结果。
>> format long g
>> 4 - eps(2)
ans =
4
事实上,MATLAB 以二进制形式存储数字。我们可以看到该数字的十进制版本为:
>> sprintf('%.55f',4-eps(2))
ans =
3.9999999999999995559107901499373838305473327636718750000
显然 MATLAB 不应该显示那一串乱七八糟的数字,但通过将结果四舍五入到 15 位数字,我们得到 4 位用于显示。
显然,calc(1,11) 中的值是这样一个数字,在内部表示为小于 4,因为它太小以至于在显示时四舍五入为 4,但它不完全是 4。
永远不要相信浮点运算结果中显示的最低有效位。
编辑:
你似乎认为MATLAB中的3.999999999999999应该小于4。从逻辑上讲,这是有道理的。但是当你提供那个数字时会发生什么?啊,是的,浮点 double 的粒度比那个大。 MATLAB 无法将其表示为小于 4 的数字。它在内部将该数字四舍五入为正好 4。
>> sprintf('%.55f',3.9999999999999999)
ans =
4.0000000000000000000000000000000000000000000000000000000
关于Matlab地板错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12610903/