Преобразование 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
может быть представлен, так что никто не ожидал бы потери точности.