Какую роль играют float и double в скобках?
Такая запись имени типа в скобках в выражении - это явное приведение типа. Тут вы указываете компилятору, что выражение надо преобразовать вот к такому вот типу (флоат, в данном случае). 

float нужен вам в начале, потому что вещественные константы имеют тип double. Поэтому у eps/2.0 и 1.0 в первом цикле имеют тип double, все вычесляется в double. Преобразовав одно из выражений в float вы получаете то, что вам надо. Без этого все вычисления идут в double и ответ находится не тот. На самом деле там float при сравнении все-равно расширяется до double но на результат сравнения это не влияет в данном случае. 

Еще, вместо явного приведения типов, можно поставить f после вещественных констант, чтобы указать компилятору, что это float:
while (1 + eps/2.0f != 1.0f){

Тогда вычисления будут во float и ответ будет правильный.

Во втором цикле double вам не нужен. Ведь вычисления итак идут в этом типе. Да и написано у вас там с опечаткой, вы к типу double приводите все выражение со сравнением. т.е. вы булево значение преобразуете в дабл. Потом оно назад в булево преобразуется при проверке условия циклом. В итоге это бесполезное действие.
Ключевое слово float и double используется для объявления переменных с плавающей точкой одинарной и двойной точности соответственно. В данной программе они используются для приведения результата выражения к типу переменной с плавающей точкой.

В условии цикла while используется сравнение двух чисел, одно из которых получено путем деления eps на 2 и прибавлением единицы, а второе - просто единица. Сравнение проводится с помощью оператора !=. Если сравнение истинно, то цикл продолжается, в противном случае - прерывается.

Сравнение на равенство двух переменных типа float или double может быть неточным из-за ограниченной точности хранения чисел с плавающей точкой в компьютере. Используя (float) и (double) перед выражением в скобках, мы приводим результат к типу переменной с плавающей точкой соответствующей точности.

Если убрать скобки с выражения, то произойдет следующее: сначала выполнится деление переменной eps на 2.0, затем результат будет прибавлен к единице. Затем это выражение сравнится с единицей, используя оператор !=. В результате получится сравнение чисел разных типов (типа float и int), что может привести к некорректному результату.

Чтобы получить точный результат, программа использует константы FLT_EPSILON и DBL_EPSILON из заголовочного файла , которые определяют машинный эпсилон для типов float и double соответственно. Сравнивая результаты, полученные в цикле с этими константами, мы можем определить, какой результат является более точным.