Erro ao subtrair números de ponto flutuante ao passar por 0,0
O seguinte programa:
#include <stdio.h>
int main()
{
double val = 1.0;
int i;
for (i = 0; i < 10; i++)
{
val -= 0.2;
printf("%g %s\n", val, (val == 0.0 ? "zero" : "non-zero"));
}
return 0;
}
Produz esta saída:
0.8 non-zero
0.6 non-zero
0.4 non-zero
0.2 non-zero
5.55112e-17 non-zero
-0.2 non-zero
-0.4 non-zero
-0.6 non-zero
-0.8 non-zero
-1 non-zero
Alguém pode me dizer o que está causando o erro ao subtrair 0,2 de 0,2? Isso é um erro de arredondamento ou algo mais? Mais importante, como evito esse erro?
EDIT: Parece que a conclusão é não se preocupar com isso, já que o 5.55112e-17 é extremamente próximo de zero (obrigado a @therefromhere por essa informação