为什么返回值为空,既找不到1.62,而实际有1.62

clc,clear
BSsp = 0.3:0.01:1.70;
find(BSsp==1.62)

在 MATLAB 中,由于浮点数的精度问题,在计算机内部二进制表示中,有些实数无法精确表示。因此,当我们使用 find(BSsp == 1.62) 查找数组 BSsp 中等于 1.62 的元素时,可能会出现无法查找到 1.62 的情况。

可以使用 eps 函数来检查两个浮点数之间的差是否小于一个极小值,以解决精度问题。具体操作如下:

BSsp = 0.3:0.01:1.70;
tolerance = 1e-6;  % 设置容忍误差
ind = find(abs(BSsp - 1.62) < tolerance);  % 查找 BSsp 中与 1.62 差小于容忍误差的元素

在上述代码中,设置了一个容忍误差 tolerance,然后使用 abs() 函数计算 BSsp 中每个元素与 1.62 的差的绝对值,再将其与容忍误差比较,最终得到与 1.62 差小于容忍误差的元素的下标。

另外需要注意的是,MATLAB 默认情况下使用双精度浮点数,如果要使用单精度浮点数,需要显式地指定变量的数据类型,例如 BSsp = single(0.3:0.01:1.70)

根据参考资料,这个问题可能是由于Matlab的精度问题所导致的。因为0.3到1.70之间的所有数是无法准确呈现的,因此应该避免直接使用等于操作符来匹配精度。

解决方法是,可以使用find和abs函数来避免Matlab精度问题。具体做法是使用以下代码:

BSsp= 0.3:0.01:1.70;
tolerance=1e-5;
result=find(abs(BSsp-1.62)<tolerance)

其中tolerance可以根据需要进行调整,表示所需的精度。在这个例子中,使用1e-5作为tolerance可以得到正确的结果,即查找到1.62的位置。

解释一下,由于等于操作符判断两个浮点数是否相等时往往存在误差,因此使用容差(tol)来判断相等。具体的实现方式就是,查找时把元素值减去1.62(这是查找的元素), 然后找它的绝对值小于tolerance。

代码如下:

clc,clear
BSsp= 0.3:0.01:1.70;
tolerance=1e-5;%容差值
result=find(abs(BSsp-1.62)<tolerance)

运行结果:

result =  33

因此,1.62在数组中的位置是33。