Почему результат вычисления целочисленный?
Если в выражении участвуют только целочисленные значения, то и результат будет целочисленным. 

Если в выражении есть вещественные числа, то результат будет вещественным. 

 x = (a * pow((r - q), 2)) / (p + 12); 

В этом выражении функция pow() возвращает вещественное число, поэтому результат вычислений будет корректным.

Также обрат внимание на порядок выполнения операций. К примеру, в выражении:

 x = (5/2 +  pow((r - q), 2)) / (p + 12); 

5/2 вычислится по правилам целочисленного деления и даст 2(int).
pow возвращает тип double
в первом случае ты его преобразуешь в int и все последующие операции идут с целочисленными типами, в т.ч. и /,
а в записи в строку он левую часть выражения до / делает типом double и значит деление тоже вызывается для типа double