Вы, кажется, говорите, что в следующем преобразовании 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, предоставляется некоторая свобода для реализации, чтобы использовать расширенный диапазон экспонент для представления промежуточных результатов; общий эффект, грубо говоря, состоит в том, что вычисление может дать «правильный ответ» в ситуациях, когда исключительное использование набора значений с плавающей запятой или набора двойных значений может привести к переполнению или потере.
blockquote>Однако:
- Это разрешено, только если выражение не
strictfp
.- Это не те «преобразования», о которых JLS говорит в JLS 5.6.2.
- Это все еще противоречит тому, что говорит учитель ОП. Он (или она) заявляет, что все вычисления с плавающей запятой выполняются с использованием
[Тысяча сто тридцать два]double
. JLS утверждает, что при определенных обстоятельствах , аппаратная платформа может использовать арифметику с расширенной точностью (возможно, с большей точностью, чем 64-битная с плавающей запятой), а в других обстоятельствах она не должна сделайте это .