Я бы хотел использовать версии 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
были совместимы - но это помогает только с будущей проверкой, а не с переносимостью.