Diferencias en el resultado redondeado al llamar a pow ()

OK, sé que había muchas preguntas sobre la función pow y el lanzamiento de su resultado en int, pero no pude encontrar una respuesta específica a esta pregunta.

OK, este es el 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;
}

Y esta es la salida: "25 25 24 25". Tenga en cuenta que solo en el tercer caso en el que los argumentos de poder no son literales tenemos un resultado incorrecto, probablemente causado por errores de redondeo. Lo mismo ocurre sin un casting explícito. ¿Alguien podría explicar qué pasa en estos cuatro casos?

Estoy usando CodeBlocks en Windows 7, y el compilador MinGW gcc que vino con él.

Respuestas a la pregunta(4)

Su respuesta a la pregunta