Учитывая выражение арифметики c с плавающей запятой, как убедиться, что его округленный результат больше истинного? - PullRequest
0 голосов
/ 17 июня 2020

Предположим, у меня есть произвольное арифметическое c выражение, в котором каждый отдельный элемент является числом с плавающей запятой (с произвольной точностью, скажем, 64-бит). Я хочу оценить это выражение как можно точнее, с важной оговоркой: результат должен быть больше , чем истинный результат (то есть каким был бы результат, если бы все посредники шаги были вычислены с бесконечной точностью).

Вот пример: a+b. Для такого простого выражения мы могли бы просто добавить a к b, используя правила IEEE 754 , а затем добавить ULP . Правила IEEE гарантируют, что выражение будет округлено до ближайшего числа с плавающей запятой, тогда добавление ULP покрывает случай, когда оно было неявно округлено вниз .

Теперь, как получить такое же поведение при заданном более сложное выражение с плавающей запятой, например ((a-b)+c/(d*e+f))/(g-h), с использованием только операторов arithmeti c? Что, если мы также разрешим математические функции, такие как log или exp?

1 Ответ

0 голосов
/ 18 июня 2020

результат должен быть больше, чем истинный результат

Трудоемкий подход предполагает использование уравнения y = f(a,b,c,...) с использованием комбинаций a, floating_point_before(a) 1 , floating_point_after(a) с 3 значениями b, 3 значениями c, ...

Это делает для n параметров 3 n комбинаций для тренировки. Затем код возвращает наибольшее значение y.

Это не обязательно соответствует «результат должен быть больше, чем истинный результат», но будет со многими уравнениями 2 .

В общем случае это сформирует не слишком чрезмерный максимум y, но не обязательно наименьший y больше истинного результата.

Конечно, если значения близки к интересный полюс f(), все ставки отключены.

Если доступно f'(a,b,c...), возможно, для тренировки потребуется меньше комбинаций - опять же, если y(a,b,c,...) не находится рядом с интересной точкой (местный мин. / макс. ).


Даже если это не соответствует всем целям OP, его достаточно легко закодировать и можно использовать в качестве проверки курса для лучшего решения.


A более формальный подход использует интервальную арифметику c, а также предлагает @ Eri c Postpischil .


1 Research nextafter()

2 Проблемы, когда y(a,b,c,...) близок к локальному максимальному / минимальному значению

...