Matlab accuracy (when 1-1~=0)

조회 수: 5 (최근 30일)
Damian Maxwell
Damian Maxwell 2022년 9월 20일
댓글: Damian Maxwell 2022년 9월 21일
Below please find a screenshot from a sample script that really puzzles me.
When defining simple variables and then substracting them there appear to be tiny error (3e-18) that comes in with surprising results.
It would be great if somebody could explain why this happens and how to avoid it.
w=0.026
b=0.024
i=0.001
w-0.026
b-0.024
i-0.001
w-(b+2*i)
w==(b+2*i)

답변 (1개)

Eric Delgado
Eric Delgado 2022년 9월 20일
편집: Eric Delgado 2022년 9월 20일
It's float operation universe. :)
w=0.026;
b=0.024;
i=0.001;
w-0.026;
b-0.024;
i-0.001;
Instead of:
w == (b+2*i)
ans = logical
0
Use:
abs(w - (b+2*i)) <= 1e-5 % You could use 1e-17 and still will receive a true logical value
ans = logical
1
  댓글 수: 5
Walter Roberson
Walter Roberson 2022년 9월 20일
1/10 is not exactly representable in finite binary floating point -- for the same mathematical reason that 1/3 is not exactly representable in finite decimal.
Suppose we were working in decimal and said 1/3 = 0.3333333333 then if we add those together 3 times we get 0.9999999999 -- which in decimal is distinct from 1.0 . In decimal you need a literally infinite number of digits of precision for the 0.3-repeated added together 3 times to produce a result that is mathematically exactly equal to 1 .
So the problem is not exactly with the fact that MATLAB uses binary: the problem is that if you choose any finite-length fixed-point base, there will always be rational fractions that cannot be exactly represented in finite length. It is an unfortunate mathematical limitation of the Universe.
Damian Maxwell
Damian Maxwell 2022년 9월 21일
Thank you so much Walter for the clear explanation.

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Logical에 대해 자세히 알아보기

제품


릴리스

R2021b

Community Treasure Hunt

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

Start Hunting!

Translated by