Error restando números de coma flotante al pasar por 0.0

El siguiente 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;
}

Produce esta salida:

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

¿Alguien puede decirme qué está causando el error al restar 0.2 de 0.2? ¿Es este un error de redondeo o algo más? Lo más importante, ¿cómo evito este error?

EDIT: Parece que la conclusión es no preocuparse por eso, dado que 5.55112e-17 es extremadamente cercano a cero (gracias a @therefromhere por esa información).

Respuestas a la pregunta(4)

Su respuesta a la pregunta