Одинарная и двойная точность
Все вещественные операции в языке C выполняются с двойной точностью. Где бы в выражении не встретилось значение типа float, оно преобразуется в double. Если при преобразовании значения типа double в float (например, в присваивании) результат не может быть представлен как float, он не определен.