How to deal with Matlab's inprecision?

1 vue (au cours des 30 derniers jours)
Kailin
Kailin le 3 Déc 2019
Commenté : Rik le 3 Déc 2019
Dear all,
I have a 15*11 matrix denoted by s. Each row is the same. I looks like this:
Image 52.png
(I verified that after I run the following code "bb=s-[repmat(s(1,:),nbk,1) ]", I get sum(sum(bb))=0.)
Therefore, it is natural that:
(1) s(1,9)/sum(s(1,9))-s(1,8)/sum(s(1,8))=0
(2) s(1,9)/sum(s(1:2,9))-s(1,8)/sum(s(1:2,8))=0
However,
(3) s(1,9)/sum(s(1:3,9))-s(1,8)/sum(s(1:3,8)) which is supposed to be 0, but I get: ans = -5.5511e-17
This minor difference affects my other calculation as I need to compare the differences between two elements. When the differences are supposed to be zero, matlab gives me an inprecise number.
I wondered first why that happend in (3), but not (1) and (2), and how I can tackle it. I attached the matrix for s below.
Thanks,
K

Réponses (1)

Walter Roberson
Walter Roberson le 3 Déc 2019
You cannot fix that problem as long as you are using binary floating point numbers. Look at this:
>> 1 + 1e-17 - 1
ans =
0
Algebraically you would expect 1e-17, but you get 0 instead. http://matlab.wikia.com/wiki/FAQ#Why_is_0.3_-_0.2_-_0.1_.28or_similar.29_not_equal_to_zero.3F This is a problem inherent in binary floating point representation and using larger floating point words (e.g., some languages support quad precision as well as double precision) merely postpones the problem rather than eliminating it.
In fact, it is a problem not just with binary floating point, but also with decimal floating point, and also with floating point with any fixed base, and even with floating point that works with a finite mixed of primes somehow (e.g., base 60). You get equivalent problems with fixed point calculation in any finite list of bases as well.
The only time you do not get the problem is when you calculate using infinite precision... which can require infinite time and infinite memory... and our mathematics has not advanced enough to be able to tell whether is rational or irrational, so don't go expecting too much even if you have infinite time and memory available to you.
  1 commentaire
Rik
Rik le 3 Déc 2019
And the solution is to compare to a tolerance (e.g. 2*eps). You can write that yourself or use functions like ismembertol and uniquetol.

Connectez-vous pour commenter.

Catégories

En savoir plus sur Get Started with MATLAB dans Help Center et File Exchange

Produits

Community Treasure Hunt

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

Start Hunting!

Translated by