auto s = sqrt(x); if (fabs(s - round(s)) < eps) { /* целое */ } else { /* нецелое */ } eps подбирать по вкусу разумеется, метод далёк от точного, если тебе нужно определять, является ли целое число полным квадратом, лучше использовать другой способ
У меня выражения y = sqrt(x); if (y == ceil) всегда точно определяют, что х - это полный квадрат, а корень из него - целое число. Проверено в цикле for (double x = 1; x <= 1e10; x++) Ошибок нет.