ismembertol does not work as documented
3 ビュー (過去 30 日間)
古いコメントを表示
Hello,
This function should work with absolute tolerance. Here is an example where it doesn't work as documented
B=[ 1.9500 1.0000];
A=[3.0000 2.0000 4.0000 2.5000 1.2000 1.1000];
[Loc1,Loc2]=ismembertol(B,A,0.1,'DataScale',1)
What should come out according to documentation is
Loc1 =
1×2 logical array
1 1
Loc2 =
2 6
What does come out however is
Loc1 =
1×2 logical array
1 0
Loc2 =
2 0
It seems someone forgot the absolute when comparing :)
0 件のコメント
採用された回答
Matt J
2019 年 8 月 20 日
編集済み: Matt J
2019 年 8 月 20 日
The documentation isn't wrong. You've set a tolerance that can only satisfied reliably at A(6) in infinite precision arithmetic. Observe:
>> [Loc1,Loc2]=ismembertol(B,A,0.1+eps,'DataScale',1)
Loc1 =
1×2 logical array
1 1
Loc2 =
2 6
3 件のコメント
Matt J
2019 年 8 月 21 日
Hmmm. But 1.100000000000000088817841970012523233890533447265625 looks higher than double precision (more than 16 decimal points) ?
Guillaume
2019 年 8 月 21 日
It's the complete expansion of the binary fraction. I used Jame Tursa's num2strexact for that. As James says on that page, Don't confuse the exact conversion with significance. These extra digits are just noise. The double before 1.1 is:
>> num2strexact(1.1-eps(1.1))
ans =
'1.0999999999999998667732370449812151491641998291015625'
and the difference between the two is
>> eps(1.1) %1.1-eps(1.1) has the same eps
ans =
2.2204e-16
as you can see the difference is around 1e-16 so at the 16th digit.
その他の回答 (0 件)
参考
カテゴリ
Help Center および File Exchange で Number Theory についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!