one problem about ismember function
5 views (last 30 days)
Show older comments
Lin Yang on 10 Jul 2018
Commented: Steven Lord on 10 Jul 2018
Hi, everyone, when I'm using ismemeber function, something goes wrong:
it should display i = 25,50,75 and 100; but it only display 50,75,and 100;
Can anyone tell me why? Many thanks.
OCDER on 10 Jul 2018
Edited: OCDER on 10 Jul 2018
This isn't an issue with ismember but with floating point math in general. Computers can't always add and subtract floating point number precisely, which introduces some rounding errors. Thus, when using "==" or ismember to compare floating point numbers, you run into issues.
Read the example for "Comparing Floating Point Numbers" at https://www.mathworks.com/help/matlab/ref/eq.html
C = 0.5-0.4-0.1
%Should be mathematically equal to 0, right? NOPE! returns -2.7756e-17.
C == 0
Equality returns false.
ismember returns false.
To fix, you have to see if the values are close enough via some sort of tolerance level.
abs(C-0) < 1E-15
Inequality returns true. C is close enough to 0 to be considered 0.
In your case, don't use ismember. Instead do something like:
if any(abs(A(i)-B) < 1E-15)
More Answers (1)
Sayyed Ahmad on 10 Jul 2018
That is not a problem of ismember function. The machine accuracy is in matlab eps
to better understand you have to try this
I IEEE Standard “double precision floating point” is eps ≈ 1.11 × 10−16. In matlab the eps is 2^-52 but as you see +2*eps or less 2*eps deliverd the same resault.
in your case A(25)-5 is equal 4*eps which is numeric precision of calculation for 0.2:0.2:20.
If you use the diffrent of values (A(25)-5)<=4*eps the answer will be logical true.
I hope that is the answer of your quastion.
Find more on Logical in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!Start Hunting!