Каковы правила, регулирующие сужение конвертации из double в float? - PullRequest
0 голосов
/ 15 декабря 2018

Существует ли величина (десятичный диапазон), на которой основано преобразование от двойного к плавающему?Вначале я так думал, но экспоненциальная часть меня смутила. Итак, какие правила управляют этим преобразованием

секунда. При преобразовании из числа с плавающей точкой в ​​целое это правило просто убирает дробную часть?значение 12,5 * 10 ^ -6 будет равно нулю?

РЕДАКТИРОВАТЬ:

Я напишу свой вопрос в другой более точной форме:

  • Чтоправила двоичного уровня для преобразования double в число с плавающей точкой в ​​java (т. е. знак, мантисса, манипуляция экспонентой во время сужающего преобразования)

  • Соответствуют ли эти двоичные правила десятичным правилам (читаемым человеком)чтобы результат мог быть предсказуемым на основе исходного (двойного) значения?

  • Существуют ли аналогичные правила при преобразовании правил с плавающим типом в целочисленные типы?

Спасибо

1 Ответ

0 голосов
/ 15 декабря 2018

Хорошо, поскольку согласно комментарию запрашиваются двоичные операции:

В общем см. 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)

Можно ли все это сделать вручную и, следовательно, прогнозировать результаты: да, конечно, в противном случае эти определения были бы бесполезны.Но это требует от вас работы с двоичным представлением чисел, с которыми вы имеете дело, так как, например, «отбрасывание цифр» создает разные результаты в зависимости от базы.

...