Diferença de float e double na prática

Oi pessoal, sou iniciante na linguagem C e gostaria de entender a diferença entre dois códigos (a única coisa que muda é o tipo das variáveis).

CÓDIGO 1 (Esse não funciona) :

`

int main () {

	double nac;
	double am;
	double ps;
	
	printf("Digite sua nota de NAC: \n");
	scanf("%f", &nac);

	printf("Digite sua nota de AM: \n");
	scanf("%f", &am);

	printf("Digite sua nota de PS: \n");
	scanf("%f", &ps);

	double calculaMedia;
	calculaMedia = (nac * 0.2) + (am * 0.3) + (ps * 0.5);

	printf("%.1f", calculaMedia);

}`

CÓDIGO 2 (Esse funciona) :

`int main () {

	float nac;
	float am;
	float ps;
	
	printf("Digite sua nota de NAC: \n");
	scanf("%f", &nac);

	printf("Digite sua nota de AM: \n");
	scanf("%f", &am);

	printf("Digite sua nota de PS: \n");
	scanf("%f", &ps);

	float calculaMedia;
	calculaMedia = (nac * 0.2) + (am * 0.3) + (ps * 0.5);

	printf("%.1f", calculaMedia);

}`

Gostaria de entender porque ele funciona com o float e com o double não…
Com o double o resultado é sempre 0.00!

Obs.: Ambos os códigos estão com o include stdio.h, é que na hora de copiar aqui o fórum o distorceu.

Agradeço pela ajuda!

Ele não funciona com double porquê para ler ou escrever doubles com funções como scanf e printf você deve usar %lf ao invés do apenas %f. Teste o código modificado:

int main () {
  double nac;
  double am;
  double ps;

  printf("Digite sua nota de NAC: \n");
  scanf("%lf", &nac);

  printf("Digite sua nota de AM: \n");
  scanf("%lf", &am);

  printf("Digite sua nota de PS: \n");
  scanf("%lf", &ps);
 
  double calculaMedia;
  calculaMedia = (nac * 0.2) + (am * 0.3) + (ps * 0.5);

  printf("%.1f", calculaMedia);
}