Strange behavior of if statement
1 visualización (últimos 30 días)
Mostrar comentarios más antiguos
martino corrà
el 15 de Abr. de 2021
Comentada: martino corrà
el 15 de Abr. de 2021
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 comentarios
Respuesta aceptada
Rik
el 15 de Abr. de 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
Más respuestas (1)
DGM
el 15 de Abr. de 2021
Editada: DGM
el 15 de Abr. de 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
Ver también
Categorías
Más información sobre Applications en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!