Преобразование int/long zero в double

Учитывая этот фрагмент кода:

int i = 0;
double d1 = (double) i;
long l = 0L;
double d2 = (double) l;

Запуск этого на моей машине печатает 0.0 для обоих преобразований. Но может d1 а также d2 когда-либо быть, но 0.0 ?

Как я понимаю, это расширяющееся примитивное преобразование, о котором говорится в спецификации:

Расширяющееся примитивное преобразование не теряет информацию об общей величине числового значения.

так же как

Расширяющееся преобразование значения типа int или long в float или long в значение double может привести к потере точности

Как я понимаю в спецификации, вышесказанное будет означать, что int 0 всегда будет double 0.0 но long 0 может быть преобразован во что-то другое (например, 1E-20 или что-то типа того). Правильна ли моя спецификация?

1 ответ

Решение

Полная цитата:

Расширяющееся преобразование значения типа int или long в float или long в значение double может привести к потере точности, то есть результат может потерять некоторые из младших значащих битов значения. В этом случае результирующее значение с плавающей запятой будет правильно округленной версией целочисленного значения с использованием режима округления до ближайшего стандарта IEEE 754.

(Акцент мой)

Это охватывает случай, когда int/long значение не может быть точно представлено в float/double (в этом случае выбирается ближайшее представимое значение). Очевидно, что 0 может быть представлен, так что никто не ожидал бы потери точности.

Другие вопросы по тегам