Matlab accuracy (when 1-1~=0)
3 次查看(过去 30 天)
显示 更早的评论
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)
0 个评论
回答(1 个)
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)
Use:
abs(w - (b+2*i)) <= 1e-5 % You could use 1e-17 and still will receive a true logical value
5 个评论
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.
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Logical 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!