Using "find" for finding decimal values
    24 views (last 30 days)
  
       Show older comments
    
Hi
I use the matlab command importdata:
X = importdata('filename.csv');
to read in a csv file with three columns.
Now, for finding a specific values in the matrix X, I simple use the find command as follows:
idx = find(X(:,1 ) == 17)
But, the same seems not to be possible for decimal numbers. This for instance would not work:
idx = find(X(:,1 ) == 17.9203)
even though 17.9203 is to be found in the original csv file. What is the problem and what can I do?
Thanks
0 Comments
Accepted Answer
  Matt Fig
      
      
 on 13 Dec 2012
        
      Edited: Matt Fig
      
      
 on 13 Dec 2012
  
      MiauMiau, the numbers you are looking for are obviously different from the short format you see. Do this:
[~,idx] = min(abs(X(:,1) - 6.0018));
Y = X(idx,1);
[~,idx] = min(abs(X(:,1) - 17.9203));
fprintf('%15.15f   %15.15f\n',Y,X(idx,1))
And show us the ouput in a comment on this answer, don't add another answer!
I have a feeling you will need to set your tolerance much higher, like 10^-4.
4 Comments
  Matt Fig
      
      
 on 14 Dec 2012
				I found out by looking at how close your guess value was to the actual value. You may have to do some tweaking but you get the idea now.
More Answers (4)
  Azzi Abdelmalek
      
      
 on 13 Dec 2012
        Try
 idx = find(abs(X(:,1 )-17.9203)<eps)
2 Comments
  Jan
      
      
 on 13 Dec 2012
				
      Edited: Jan
      
      
 on 13 Dec 2012
  
			Substracting two numbers in the magnitude of 20 can have a roundoff error of eps(20). Then this is better:
idx = find(abs(X(:,1 ) - 17.9203) <= eps(17.9203))  % EDITED: was "<"
Even 10*eps(17.9203) would be a reliable limit.
[EDITED] Thanks, Kye. I cannot test this currently. But I assume that even "<=" can fail, when the values are at the limits of 2^n. Does eps(16 + eps(16)) reply eps(32)? Then a factor of 2 would be obligatory.
  Jan
      
      
 on 13 Dec 2012
        
      Edited: Jan
      
      
 on 13 Dec 2012
  
      There is no exact representation of decimal floating point numbers in binary format for all values. You find a lot of corresponding discussion in this forum:
0.1 + 0.2 - 0.3 == 0
>> false
This is no bug, but the expected behaviour, when floating point numbers are represented with a limited precision.
A consequence is, that you cannot compare numbers like 17.9203 and 17.92029999999999999999 sufficiently and even the display in the command window can be rather confusing.
0 Comments
  MiauMiau
      
 on 13 Dec 2012
        7 Comments
  Azzi Abdelmalek
      
      
 on 13 Dec 2012
				Yes, I said Matlab because we are working with Matlab. I think, representing real numbers for numerical programming is almost similar to what an ADC (analogic-digital converter) do. There is a quantification of a real number, which means there is an error of quantification which depends on the number of used bits and method.
  Jan
      
      
 on 13 Dec 2012
				@Azzi: I've stressed this detail, because the OP seems to be confused about this topic already. I did not assume, that you struggle with floating point arithmetics.
See Also
Categories
				Find more on Data Type Identification 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!



