0

我做的:与值替换元素是不一样的

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  

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

回答

2

因为他们是不相等的。它只是一个显示器。要看到这一点:

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

会给你

0.29893602 
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)是它应该是。

+0

我如何可以查看所有的数字? – volperossa

+0

我真的不知道。但是 - 为什么你想看到所有的数字?如果你想检查平等,检查两个数字是否在一定的容差范围内。 –

+1

我需要复制相同的行为,而无需调用inv函数(所以我只需要在产品中使用的数字...我用fprintf解析('%。55f \ n',T(1,1))XD – volperossa

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