Подтвердить что ты не робот

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, то как это считается расширяющимся? Разве это не должно рассматриваться как сужение?

4b9b3361

Ответ 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.