用值替换元素是不一样的

时间:2014-06-13 17:36:23

标签: matlab variables precision numeric floating-point-precision

我做:

T = inv([1.0 0.956 0.621; 1.0 -0.272 -0.647; 1.0 -1.106 1.703]);

获得:

T =

0.2989    0.5870    0.1140
0.5959   -0.2744   -0.3216
0.2115   -0.5229    0.3114

如果我这样做

 T(1,1)==0.2989

我获得了

ans =

 0    

其他元素相同。 为什么这个?

3 个答案:

答案 0 :(得分:2)

MATLAB存储的数字比您通常看到的数字多。 0.2989实际上是0.298936021293776(甚至不是故事的结尾)。 试试你的代码并添加

format long
T(1,1)

但仍然,

T(1,1) == 0.298936021293776
ans =
 0

所以试试

T(1,1) - 0.298936021293776

你只是看不到所有的数字。 T(1,1)就是它应该是的。

答案 1 :(得分:2)

因为他们不平等。它只是一个展示人工制品。要看到这个:

fprintf('%.8f\n', T(1,1))

会给你

0.29893602

答案 2 :(得分:1)

测试浮点数是否完全相等是危险的。默认情况下,MATLAB使用64位来存储浮点值,而0.1等某些值甚至不能用任意数量的位来精确表示。 T(1,1)并不完全是0.2989,您可以在以更高精度打印值时看到它:

>> T = inv([1.0 0.956 0.621; 1.0 -0.272 -0.647; 1.0 -1.106 1.703]) 
T =
    0.2989    0.5870    0.1140
    0.5959   -0.2744   -0.3216
    0.2115   -0.5229    0.3114
>> fprintf('%1.10f\n', T(1,1))
0.2989360213

这就是T(1,1) == 0.2989返回false的原因。测试两个浮点值是否几乎相等更安全,即关于容差值tol

>> tol = 1/1000;
>> abs(T(1,1) - 0.2989) < tol
ans =
     1

以下是您应该阅读的内容:click