Режимы округления IEE754: как вычисляется ошибка? - PullRequest
0 голосов
/ 10 мая 2018

В качестве примера, вот вывод из файла Java, который я написал. У него есть двоичное представление каждого числа, выровненное с тем, что я вручную вычислил, чтобы мантисса была (усечена / округлена вниз).

    67108867: 67108864.000000
      100000000000000000000000011
       00000000000000000000000
    67108868: 67108864.000000
      100000000000000000000000100
       00000000000000000000000
    67108869: 67108872.000000
      100000000000000000000000101
       00000000000000000000000

Глядя на 67108868, становится ясно, что Java использует либо круглая половина к нулю, или круглая половина к четному. Но как вычисляется ошибка, используемая для округления? Если число слишком велико, чтобы правильно поместиться в мантиссе, кажется, что найти точную ошибку было бы невозможно. Может быть, он использует дополнительные биты справа, но для многих фракций не будет ли учитываться бесконечное количество битов?

Я хочу знать конкретные детали того, как округление может быть реализовано в аппаратном обеспечении или коде.

1 Ответ

0 голосов
/ 10 мая 2018

Чтобы узнать, что такое округленный результат, необязательно знать все биты точного результата (которых может быть бесконечно много). Нужно только знать биты до того, что соответствует значению и следующему биту, и все ли оставшиеся биты равны нулю. Это приводит к четырем случаям (для округления до ближайших связей к четным):

  • Следующий бит после того, что подходит, равен нулю, а все остальные биты равны нулю: ответ точный; ошибки нет.
  • Следующий бит равен нулю, но неверно, что все остальные биты равны нулю: округление вниз.
  • Следующий бит равен единице, а все остальные биты равны нулю: ошибка равна ½ ULP, поэтому округляется до четного.
  • Следующий бит равен единице, но неверно, что все остальные биты равны нулю: округление в большую сторону.

Для простых арифметических операций, таких как сложение, вычитание, умножение и деление, эта информация легко доступна путем вычисления фиксированного числа дополнительных битов или анализа других данных, полученных во время операции (например, остатка, вычисленного при выполнении длинного деления) .

Для сложных функций, таких как тригонометрические функции, у нас нет полных доказательств, характеризующих работу, необходимую для получения необходимой информации. Большинство математических библиотек реализуют версии этих функций, которые, как гарантируют, не будут правильно округлены. Если требуется правильное округление, реализация может использовать арифметику произвольной точности, чтобы продолжить уточнение ответа, пока не определит, находится ли результат выше или ниже точки округления (½ ULP).

...