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