Хорошо, поскольку согласно комментарию запрашиваются двоичные операции:
В общем см. https://docs.oracle.com/javase/specs/jls/se11/html/jls-4.html#jls-4.2.4
A) double
до float
:
Язык программирования Java требует, чтобы арифметика с плавающей запятой велась так, как если бы каждый оператор с плавающей запятой округлял свой результат с плавающей запятой до точности результата.
Таким образом, двойное число округляется до следующего числа с плавающей запятой,Преобразование можно описать следующим образом:
- Сохраните знак.
- приведите
signed int 11
, использованный в качестве показателя степени, к signed int 8
.Если это невозможно, поскольку это вызывает переполнение, верните Float.POSITIVE_INFINITY
или Float.NEGATIVE_INFINITY
. - и отбросьте последние 29 бит мантиссы путем округления.
КакВ результате вы преобразовали бит 1 + 11 + 52 в двойном формате в бит 1 + 8 + 23 в формате с плавающей запятой.
B) с плавающей запятой в int
:
Язык программирования Java использует округление до нуля при преобразовании плавающего значения в целое число (§5.1.3), которое в этом случае действует так, как если бы число было усечено, отбрасывая биты мантиссы.
Итак, в простых терминах: запишите число (не в научной нотации) и удалите все, кроме .
. В ПК это, вероятно, работает, сдвигая биты экспоненты мантиссы в соответствующем направлении, затем отбрасывая (неокругление!) любые оставшиеся десятичные дроби.И в итоге умножаем результат на -1
, если число с плавающей точкой было отрицательным.вкратце:
int = float.mantissa << float.exponent * (float < 0 ? -1 : 1)
Можно ли все это сделать вручную и, следовательно, прогнозировать результаты: да, конечно, в противном случае эти определения были бы бесполезны.Но это требует от вас работы с двоичным представлением чисел, с которыми вы имеете дело, так как, например, «отбрасывание цифр» создает разные результаты в зависимости от базы.