Внезапно потребовалось, чтобы в реализации результат численного расчета на одинаковых входных данных был (бинарно) тождественным, независимо от машины на которой проводился расчет.
Следую рекомендациям из
https://www.eucass.eu/doi/EUCASS2019-0790.pdf . (Настройка округления, флаги компилятора и т.д.)
Однако, воспроизводимости добиться не удалось.
Выяснилось что в различие в цепочке промежуточных расчетов появляется при вызове функции double std::exp(double), которая реализована в libm.so, и дает немножко разный результат для разных версий libm.
| сравнение |
| считаю значение exp(-9.2935498391158440e+00)
|
| |
Прилинковать libm статически — не удалось. (Она де-юре является частью libc, а его не удалось прилинковать статически к *.so.)
Вопрос: Где можно найти альтернативную реализацию базовых математических функций, чтобы заменить libm?
В boost.math, в числе спец функций как-раз exp отсутствует.