На этой странице было замечено, что ни одна из математических функций в С++ 11, похоже, не использует constexpr, тогда как я полагаю, что все они могли бы быть. Таким образом, у меня остается два вопроса, один из них - почему они решили не использовать функции constexpr. И два для такой функции, как sqrt
я, вероятно, мог бы написать свой собственный constexpr, но что-то вроде sin или cos было бы сложнее, поэтому есть ли способ обойти это.
Constexpr Математические функции
Ответ 1
На самом деле, из-за старого и раздражающего наследия почти ни одна из математических функций не может быть constexpr
, так как все они имеют побочный эффект установки errno
при различных условиях ошибки, обычно это ошибки домена.
Ответ 2
Из "Язык программирования С++ (4-е издание)", написанный Б. Страуступом, описывающий С++ 11:
"Для оценки во время компиляции функция должна быть достаточно простой: функция constexpr должна состоять из одного оператора return, no loops и локальных переменных не допускается. Кроме того, функция constexpr может не иметь побочных эффектов."
Это означает, что он должен быть встроенным, без операторов while и if и локальных переменных. Побочные эффекты также запрещены (например, изменение errno). Другая проблема заключается в том, что большинство математических функций являются инструкциями FPU, которые не представлены в чистом c/С++ (они написаны в коде ассемблера). Поэтому, если функция cmath не указана как constexpr.
Ответ 3
Поэтому на этой странице было замечено, что ни одна из математических функций в С++ 11 кажется, использует constexpr, тогда как я считаю, что все они могли быть. Так что это оставляет мне два вопроса: почему они выбирают не создавать функции constexpr.
Эта часть очень хорошо ответила Себастьян Редл и Адам Сжай, поэтому ничего не добавит к ней.
И два для функции, такой как sqrt, я мог бы, вероятно, написать свой собственный constexpr, но что-то вроде греха или cos будет сложнее, так что есть прочь вокруг него.
Да, вы можете написать свою собственную версию constexpr sin, cos, используя разрастания последовательностей Taylor этих функций. Взгляните на этот супер-класс github repo, который реализует несколько математических функций как функции constexpr Morwenn/static_math