Java почему преобразование long (64) в float (32) считается расширением?

как говорится в oracle

справка Oracle Docs

Расширяющегося Примитивного Преобразования 19 конкретные преобразования примитивных типов называются расширяющимися примитивными преобразованиями:

  1. байт до short, int, long, float или double
  2. short в int, длинные, с плавающей точкой или двойной
  3. char для int, long, float или double
  4. int в Long, float, или двойной
  5. долго float или Double?
  6. float к Double

Если float имеет 32 бита, а long имеет 64, как это считается расширением? Разве это не следует считать сужением?

4 ответов


диапазон значений, который может быть представлен float или double намного больше диапазона, который может быть представлен long. Хотя можно потерять значительные цифры при преобразовании из long до float, Это все еще" расширяющаяся " операция, потому что диапазон шире.

С Спецификация Языка Java, §5.1.2:

расширяющееся преобразование int или длинного значения в float или длинного значения в двойной, может привести к потере точности, то результат может потерять некоторые из наименее значимых битов значения. В этом случае результирующее значение с плавающей запятой будет правильно округленной версией целочисленного значения, используя режим IEEE 754 round-to-nearest (§4.2.4).

обратите внимание, что a double может точно представлять все возможные int значение.


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


Он считается расширяющимся, потому что числа, которые могут быть представлены поплавком, больше, чем числа, которые могут быть представлены long. Только потому, что float использует 32-битную точность, не означает, что числа, которые он может представлять, ограничены 2^32.

например, float (float)Long.MAX_VALUE+(float)Long.MAX_VALUE больше, чем Long.MAX_VALUE, хотя поплавок имеет меньшую точность, чем длинный.


Если посмотреть на дело в простых терминах, то речь идет о том, как сведения были представлены оригинальные дизайнеры.

в идеале битовая глубина long (64) больше, чем float(32). Но данные float представлены с помощью научное понятие что позволяет представлять значительно больший диапазон

Ex: 300[исходный номер]: 3×102 [научное представление]


длинный : -2^63 до 2^63-1

поплавок : (-3.4)*10^38 до (3.4)*10^38

обратите внимание на длинную(мощность двух) Vs Float (мощность десяти) репрезентативную разницу здесь, которые позволяют float иметь более высокий диапазон

надеюсь, что это поможет