Вы должны различать преобразование типов и преобразование значений.Стандарт C ++ (в том числе и C) позволяет выполнять вычисления с плавающей точкой с повышенной точностью.
"Значения плавающих операндов и результаты плавающих выражений могут быть представлены с большей точностью и в диапазоне, чем требуетсяпо типу; типы не меняются. "
Как типы, b + c является сложением двух чисел с плавающей точкой.Результатом является поплавок.Затем результат получает тип, удваивающийся до двойного, и два умножения выполняются как двойные с результатом двойного.
Однако реализации разрешено выполнять все вычисления, включая b + c, с использованием двойных чисел (иливысокая точность).Действительно, я попробовал это с помощью Visual C ++, и он выполнил все вычисления с использованием 80-битного стека с плавающей точкой, доступного на x86.