IEEE754: гарантии на результаты деления - PullRequest
0 голосов
/ 13 мая 2018

Рассмотрим:

\x/10^y = z.5

x - положительное целое число с максимальным значением, которое вряд ли будет превышать около 10 000 000.

y - это небольшое целое число, равное> = 0, с максимальным значением около 5; При необходимости я могу установить верхний предел.

z вычисляется, а затем округляется до ближайшего целого числа, причем полпути округляются в большую сторону. Меня интересуют случаи, когда численно правильный ответ округляется в большую сторону, но двойная точность 754 дает «неправильный» ответ, который затем округляется в меньшую сторону. Таким образом, другими словами, численно правильный результат имеет дробную часть, которая составляет> = 0,5, но дробная часть фактического результата составляет <0,5. </p>

Язык, который я использую, не дает мне доступа к настройке FPU, поэтому я могу использовать только настройки по умолчанию (в основном x86_64, Linux и Windows).

Должен ли я просто признать, что некоторые ответы будут «неправильными», или я могу наложить ограничения на x и y , которые гарантированно дадут требуемый ответ? Или есть альтернативный расчет, который даст правильный ответ после округления? При необходимости я также могу изменить определение того, как z будет округлено, если я действительно могу дать гарантии о результате.

1 Ответ

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

Предполагая:

  • x ≤ 10 000 000.
  • 0 ≤ y ≤ 5.
  • IEEE-Используется 754 базовых 64-разрядных двоичных числа с плавающей запятой с округлением до ближайшего числа, связанного с четностью.

Тогда результатом деления никогда не будет число, дробная часть которого меньше½, но округляется до ½.

Наибольший результат достигается, когда x = 10 000 000 и y = 0, в этом случае z = 10 000 000,Тогда z имеет 24 бита в своей целочисленной части.Формат с плавающей запятой имеет 53 бита в значении, поэтому 29 остаются доступными для дробной части.Это означает, что любая часть дроби, меньшая ½ - 2 -30 , будет округлена до ½ - 2 -29 или меньше (поскольку биты, доступные для дроби, могут делать различия, которыеотлично - если математический результат меньше ½ - 2 -30 , то представимое значение ближе к нему, чем ½, поэтому используется меньшее значение).

Поэтому толькоточный математический результат с дробью в [½ - 2 -30 , ½) может быть меньше ½, но округлен до ½.Пусть z будет таким значением, и пусть t будет его дробной частью.

Из постановки задачи мы знаем, что z • 10 y - целое число ( x ).Поэтому t • 10 y является целым числом, и, даже если y меньше 5, t • 10 5 - это целое число.

Поскольку t находится в [½ - 2 −30 , ½), t • 10 5 в [(½ - 2 −30 ) • 10 5 , ½ • 10 5 ) = [50 000 - 2 -30 • 10 5 , 50 000) = [50 000 - 0,0000931322574615478515625, 50 000).

Очевидно, что в этом интервале нет целых чисел, поэтому неттакой z существует.

...