Why find cannot handle this very simple task?

X = -0.1:.001:.25;
find(X == .077)
I get the following:
ans = 1×0 empty double row vector
However X(178) = 0.077. How to get back index 178?

回答 (2 件)

Stephan
Stephan 2021 年 4 月 19 日

0 投票

You are dealing with doubles, they are not precisly 0.077 - use round:
X = -0.1:.001:.25;
find(round(X,3) == .077)

3 件のコメント

Mr M.
Mr M. 2021 年 4 月 27 日
ok, i see, but what about the right hand side, .077 is ok? round(.077,3) is not better?
Mr M.
Mr M. 2021 年 4 月 27 日
I can not undersatnd: if .077 is good, than -0.1:.001:.25 is why not good? since elements of this vector is -0.100+0.001+0.001+etc., and each term is rounded to 3th order
Steven Lord
Steven Lord 2021 年 4 月 27 日
I wouldn't use round here. Decide how close is "close enough" and use that as the tolerance.
X = -0.1:0.001:0.25;
closeEnough = 1e-8;
X(find(abs(X-0.077) < closeEnough))
ans = 0.0770
Or work with integer values and convert to non-integer values as needed:
X2 = -100:250;
X2(X2 == 77)/1000
ans = 0.0770
Or use ismembertol which tries to choose a good "close enough" tolerance.
X(ismembertol(X, 0.077))
ans = 0.0770

サインインしてコメントする。

Jan
Jan 2021 年 4 月 27 日

0 投票

Welcome to the world of calculations with numbers represented with limited precision.

カテゴリ

ヘルプ センター および File ExchangeMatrix Indexing についてさらに検索

タグ

質問済み:

2021 年 4 月 19 日

回答済み:

Jan
2021 年 4 月 27 日

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by