PDA

查看完整版本 : MATLAB ismember()问题


poster
2019-12-10, 16:49
以下命令返回1:

ismember(-0.6, -1:.1:.9) 但是下一条命令返回0:

ismember(-0.1, -1:.1:.9) 即使-0.1明显位于-1:.1:.9。

有人知道发生了什么吗?


回答:
问题是,当您从-1.0开始并重复添加0.1时,得到的数字与直接指定-0.1时得到的数字略有不同。这是因为浮点错误累积。就像1/3不能精确地用十进制表示(变成0.33333 ...)一样,许多十进制数字也不能精确地用二进制表示。转换为二进制时,0.1实际上非常接近于0.1。由于在使用该浮点数进行算术时会出现轻微的错误,因此此小差异会累积并变得越来越大。

从http://www.mathworks.com/matlabcentral/newsreader/view_thread/246492 :

<blockquote> Ashwini Deshpande写道:

我有一个矩阵如下

a = 0:0.1:1; 当我尝试使用以下过程查找矩阵a是否存在0.300时,

>> [tf, loc]=ismember(0.3,a) 我得到以下结果:

tf = 0 loc = 0 但这是给我的, tf = 1 , loc =4 。

实际上,您得到的是正确的结果。看看会发生什么:

v=0:.1:1; n=0.3; sprintf('%30.20f\n',v(4),n) %{ 0.30000000000000004000 %