Java почему преобразование long (64) в float (32) считается расширением?
как говорится в oracle
справка Oracle Docs
Расширяющегося Примитивного Преобразования 19 конкретные преобразования примитивных типов называются расширяющимися примитивными преобразованиями:
- байт до short, int, long, float или double
- short в int, длинные, с плавающей точкой или двойной
- char для int, long, float или double
- int в Long, float, или двойной
- долго float или Double?
- 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 иметь более высокий диапазон
надеюсь, что это поможет