Почему не переполняется float?
Магия плаващих точек :)
Числа должны быть примерно одного порядка, иначе UB (с оговорками).
3.4е38 + 1.0 = 3.4е38. Это равнозначно 3.4е38 + 0.0, потому что 1 по сравнению с 1е38 равно нулю.
А при умножении различие будет уже в 7 знаке после запятой, которую float может обнаружить и сообщить о переполнении (+INF).
Представьте, у нас десятичная арифметика с тремя значащими цифрами. Соответственно, сложение работает не более чем с пятью цифрами: три собственно значащих, слева на перенос и справа на округление. То, что получилось, в любом случае будет округлено до трёх. 99900000000000
+             1,00
 -----------------
 9990   →   9,99e13
Если сделать второе слагаемое покрупнее, то будет 99900000000000
+   50000000000
 -----------------
 9995   →   1,00e14 → переполнение
То есть вот что надо добавить, чтобы случилось переполнение: в зависимости от настроек сопроцессора или ulp(FLT_MAX) (ULP = Unit of Last Place — цена младшего разряда на данном порядке), или ulp(FLT_MAX)/2.