Strange behavior of if statement
1 vue (au cours des 30 derniers jours)
Afficher commentaires plus anciens
i have this very simple code that should return 'ans = 1' when run, since the sum of d is 1. However it returns the error message specified in the 'else' section instead, as if d didn't add up to 1. What's going on?
d = [.4 .1 .1 .1 .1 .1 .1];
if sum(d) == 1
sum(d)
else
error('d doesnt add up to 1')
end
0 commentaires
Réponse acceptée
Rik
le 15 Avr 2021
Welcome to floating point integers.
Matlab stores these numbers in a binary representation with a finite precision. Similar to what would happen if you only store 4 decimals and do this: (1/3)*3=0.3333*3=0.9999.
You should probably compare to a tolerance:
d = [.4 .1 .1 .1 .1 .1 .1];
if abs( sum(d)-1 ) <= 2*eps
sum(d)
else
error('d doesnt add up to 1')
end
Plus de réponses (1)
DGM
le 15 Avr 2021
Modifié(e) : DGM
le 15 Avr 2021
It's correct. The sum isn't 1. It's approximately 1.
d = [0.4 0.1 0.1 0.1 0.1 0.1 0.1]; % leading zeros for readability, pls
sum(d) % that sure looks like 1
sum(d)-1 % but you just don't have the display resolution to see the error
gives
ans =
1.0000
ans =
-1.1102e-16
Beware simple equality tests when using floating point numbers. Test to within a tolerance.
tol=1E-12;
if abs(sum(d)-1)<tol
sum(d)
else
error('d doesnt add up to 1')
end
Voir également
Catégories
En savoir plus sur Applications 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!