Альтернативная реализация libm
От: Chorkov Россия  
Дата: 08.05.21 07:55
Оценка:
Внезапно потребовалось, чтобы в реализации результат численного расчета на одинаковых входных данных был (бинарно) тождественным, независимо от машины на которой проводился расчет.
Следую рекомендациям из https://www.eucass.eu/doi/EUCASS2019-0790.pdf . (Настройка округления, флаги компилятора и т.д.)

Однако, воспроизводимости добиться не удалось.
Выяснилось что в различие в цепочке промежуточных расчетов появляется при вызове функции double std::exp(double), которая реализована в libm.so, и дает немножко разный результат для разных версий libm.

  сравнение
считаю значение exp(-9.2935498391158440e+00)
флаг округления FE_TONEAREST (по умолчанию) FE_DOWNWARD FE_UPWARD FE_TOWARDZERO
libm 2.31 9.2015838408730848e-05 9.2015838408730834e-05 9.2015838408730848e-05 9.2015838408730834e-05
libm 2.28 9.2015838408730834e-05 9.2015838408730834e-05 9.2015838408730834e-05 9.2015838408730834e-05


Прилинковать libm статически — не удалось. (Она де-юре является частью libc, а его не удалось прилинковать статически к *.so.)

Вопрос: Где можно найти альтернативную реализацию базовых математических функций, чтобы заменить libm?
В boost.math, в числе спец функций как-раз exp отсутствует.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.