Достижение идентичного результата вычисления с плавающей запятой на разных платформах / компиляторах? - PullRequest
2 голосов
/ 07 марта 2019

Разные платформы имеют различные возможности FP с различными параметрами и поведением, в результате чего существует некоторая разница между результатами вычислений, которые они производят, которые каскадируются и усиливаются на каждом промежуточном этапе.

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

1 Ответ

0 голосов
/ 07 марта 2019

Даже если у вас 64-битный IEEE754 double, есть несколько дополнительных вещей, которые вам нужно проверить.

  1. Убедитесь, что у вас строгий с плавающей запятой. Не позволяйте вашему компилятору использовать, например, 80 битов для промежуточных вычислений.

  2. Различные операции (все арифметические операции, такие как те, которые вы упомянули, std::sqrt и т. Д.) Требуются IEEE754 для получения наилучшего возможного числа. (Если вам нужны другие, убедитесь, что все ваши операции упомянуты в стандарте IEEE754, и ваша платформа строго соблюдает их - это может не произойти).

  3. Уклоняться от других функций (таких как тригонометрические функции), для которых нет гарантии точности, даже в соответствии с IEEE754.

В вашем конкретном случае оказывается, что (1) достаточно вместе с, возможно, (для C ++)

static_assert(std::numeric_limits<double>::is_iec559, "IEEE 754 floating point required");
...