Matlab地板错误?

标签 matlab floating-point rounding precision

<分区>

我想我在 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/

相关文章:

java - 使用 Java double (或其他任何东西)存储简单分数

c++ - 如何将浮点值移位到可以精确表示的特定小数位数的最接近的值?

c - C中的scanf(用于扫描 float )和精度问题

c - 浮点舍入错误将报告的结果移动到范围内

matlab - 在循环中更改变量名称

matlab - OpenCV vs Matlab - 线路/走廊检测

matlab - 单个冲浪图的多个轴

matlab - 在Matlab中只计算矩阵乘积的对角线

apache-pig - Pig 向下舍入到小数点后第 n 位

c# - 如何在 C# 中舍入浮点值?