Я бы хотел использовать версии constexpr стандартных функций <cmath> таких как exp, log, pow переносимым образом. В настоящее время у меня нетранспортное решение g++ рассматривает эти функции как constexpr - несовместимое расширение C++, но меня беспокоит переносимость и будущая проверка (я полагаю, что это расширение можно было бы однажды удалить из g++).
Меня интересуют версии constexpr этих функций, а не шаблонные метапрограммы - я хочу, чтобы те же функции были доступны как во время компиляции, так и во время выполнения. Мне не нужна совместимость C, но мне нужны быстрые реализации - наивные реализации, такие как расширения серии Taylor, будут слишком медленными.
Как я могу реализовать такие функции? Меня особенно интересуют exp, log и pow
Некоторые касательные вещи, которые я узнал из своих исследований
- Стандартно-совместимые версии этих функций не являются технически
constexprпотому что они должны иметь побочные эффекты (например, устанавливатьerrno) для поддержания совместимости C - В C++ 11 реализация была разрешена для выполнения этих функций
constexpr, но по C++ 14 это запрещено (за первый ответ на этот вопрос и ответ на этот вопрос). Это связано с тем, что я обеспокоен тем, что функции могут не бытьconstexprв будущих версияхg++ -
g++реализация каждой математической функцииfooпросто вызывает встроенную функцию__builtin_foo, которая рассматривается какconstexpr. Возможно, я мог бы называть функции__builtin_fooа не функцииfoo- они могли бы оставатьсяconstexprв будущих версияхg++даже если соответствующие функцииfooбыли совместимы - но это помогает только с будущей проверкой, а не с переносимостью.