ismembertol does not work as documented
3 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
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 commentaires
Réponse acceptée
Matt J
le 20 Août 2019
Modifié(e) : Matt J
le 20 Août 2019
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 commentaires
Matt J
le 21 Août 2019
Hmmm. But 1.100000000000000088817841970012523233890533447265625 looks higher than double precision (more than 16 decimal points) ?
Guillaume
le 21 Août 2019
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.
Plus de réponses (0)
Voir également
Catégories
En savoir plus sur Number Theory dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!