constexpr exp, log, pow

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

Ответы