Похоже, вы говорите, что в следующем случае происходит преобразование в float
.
float f1 = 0.5048076923076923F;
float f2 = 0.5048076923076923F;
float f = f1 + f2;
На самом деле преобразования нет.Все значения float
.
В частности, литерал 0.5048076923076923F
представляет собой float
.Трейлинг F
делает его float
.Если вам нужен двойной литерал, пропустите F
или замените его на D
.
Когда ваш учитель говорит, что «все значения с плавающей запятой преобразованы в double
», он ошибается.JLS говорит (в действительности), что числовой примитивный операнд будет преобразован в double
, когда другой операнд является double
.Если оба операнда float
, то операция будет выполняться с использованием арифметики с плавающей запятой одинарной точности.
Ссылка JLS: JLS 5.6.2: двоичное числовое продвижение .
Было отмечено, что на аппаратном уровне могут происходить дополнительные преобразования.Например, JLS говорит следующее:
В выражении, не являющемся строгим с точки зрения FP, предоставляется некоторая свобода для реализации, чтобы использовать расширенный диапазон экспонент для представления промежуточных результатов;общий эффект, грубо говоря, состоит в том, что вычисление может дать «правильный ответ» в ситуациях, когда исключительное использование набора значений с плавающей запятой или набора двойных значений может привести к переполнению или потере.
Однако:
- Это допустимо, только если выражение не
strictfp
. - Это не «преобразования», о которых JLS говорит в JLS 5.6.2.
- Это все еще противоречит тому, что говорит преподаватель ОП.Он (или она) заявляет, что все вычисления с плавающей запятой выполняются с использованием
double
.JLS утверждает, что при определенных обстоятельствах , аппаратная платформа может использовать арифметику с расширенной точностью (возможно, с большей точностью, чем 64-битная с плавающей запятой), а в других обстоятельствах не должнасделай это .