Comment printf et scanf poignée de précision en virgule flottante de formats?

Envisager l'extrait de code suivant:

float val1 = 214.20;
double val2 = 214.20;

printf("float : %f, %4.6f, %4.2f \n", val1, val1, val1);
printf("double: %f, %4.6f, %4.2f \n", val2, val2, val2);

Sorties:

float : 214.199997,  214.199997, 214.20 | <- the correct value I wanted 
double: 214.200000,  214.200000, 214.20 |

Je comprends que 214.20 a une infinité de représentation binaire. Les deux premiers éléments de la première ligne ont une approximation de la valeur de référence, mais le dernier ne semble pas avoir de rapprochement à tous, et cela m'a conduit à la question suivante:

Comment les scanf, fscanf, printf, fprintf (etc.) les fonctions de traiter la précision des formats?

Sans précision fournie, printf imprimé d'une valeur approximative, mais avec %4.2f il a donné le bon résultat. Pouvez-vous m'expliquer l'algorithme utilisé par ces fonctions pour gérer précision?