Diferenças no resultado arredondado ao chamar pow ()

OK, eu sei que houve muitas perguntas sobre a função pow e lançar o resultado para int, mas não consegui encontrar uma resposta para essa pergunta um pouco específica.

OK, este é o código C:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
    int i = 5;
    int j = 2;

    double d1 = pow(i,j);
    double d2 = pow(5,2);
    int i1 = (int)d1;
    int i2 = (int)d2;
    int i3 = (int)pow(i,j);
    int i4 = (int)pow(5,2);

    printf("%d %d %d %d",i1,i2,i3,i4);

    return 0;
}

E esta é a saída: "25 25 24 25". Observe que apenas no terceiro caso em que argumentos para pow não são literais, temos esse resultado incorreto, provavelmente causado por erros de arredondamento. A mesma coisa é feliz sem elenco explícito. Alguém poderia explicar o que acontece nesses quatro casos?

Eu estou usando CodeBlocks no Windows 7 e MinGW gcc compilador que veio com ele.

questionAnswers(4)

yourAnswerToTheQuestion