Java Почему преобразование длинного (64) в float (32) считается расширением?
Поскольку он указывает из oracle
Ссылка из Oracle Docs
Расширение примитивного преобразования
19 конкретных преобразований для примитивных типов называются расширяющимися примитивными преобразованиями:
- byte для коротких, int, long, float или double
- short для int, long, float или double
- char для int, long, float или double
- int для long, float или double
- долго плавать или удваивать?
- float для двойного
Если float имеет 32 бита, а long - 64, то как это считается расширяющимся? Разве это не должно рассматриваться как сужение?
Ответы
Ответ 1
Диапазон значений, который может быть представлен float
или double
, намного больше диапазона, который может быть представлен long
. Хотя при преобразовании с long
в float
можно потерять значительную цифру, это все еще является "расширяющейся" операцией, потому что диапазон шире.
Из Спецификация языка Java, §5.1.2:
Расширяющееся преобразование значения int или long для float или длинного значения в double может привести к потере точности - то есть результат может потерять некоторые из наименее значимых бит значения. В этом случае полученное значение с плавающей запятой будет правильно округленной версией целочисленного значения с использованием режима IEEE 754, близкого к ближайшему (§4.2.4).
Обратите внимание, что a double
может точно представлять все возможные значения int
.
Ответ 2
Он считал расширение, поскольку float
и double
могут представлять большие значения, чем long
. Вы можете потерять точность, но можно будет представить значение (по крайней мере приблизительно).
Ответ 3
Это считается расширяющимся, потому что числа, которые могут быть представлены поплавком, больше, чем числа, которые могут быть представлены длинными. Просто потому, что float использует 32-битную точность, не означает, что числа, которые он может представлять, ограничены 2 ^ 32.
Например, float (float)Long.MAX_VALUE+(float)Long.MAX_VALUE
больше, чем Long.MAX_VALUE
, хотя float имеет меньшую точность, чем long.