Constexpr Математические функции

Так заметили из этого страница что ни одна из математических функций в c ++ 11, кажется, не использует constexpr, тогда как я полагаю, что все они могли бы быть. Таким образом, у меня остается два вопроса, один из них — почему они решили не использовать функции constexpr. Два для такой функции, как sqrt Возможно, я мог бы написать свой собственный constexpr, но что-то вроде sin или cos было бы сложнее, так что вокруг этого нет.

52

Решение

На самом деле, из-за старого и надоедливого наследия почти ни одна из математических функций не может быть constexpr, поскольку все они имеют побочный эффект настройки errno на различных условиях ошибки, как правило, ошибки домена.

53

Другие решения

Из «Языка программирования C ++ (4-е издание)» Б. Страуструпа, описывающего C ++ 11:

«Чтобы быть оцененной во время компиляции, функция должна быть достаточно простой: функция constexpr должна состоять из одного оператора return; петли и локальные переменные не допускаются. Кроме того, функция constexpr может не иметь побочных эффектов».

Это означает, что он должен быть встроенным, без операторов for, while и if и локальных переменных. Побочные эффекты также запрещены (например: изменение errno). Другая проблема состоит в том, что большинство математических функций являются инструкциями FPU, которые не представлены в чистом c / c ++ (они написаны в коде ассемблера). Вот почему не cmath-функция объявлена ​​как constexpr.

9

Так заметили на этой странице, что ни одна из математических функций в C ++ 11
кажется, использует constexpr, в то время как я считаю, что все они могли
быть. Так что у меня остается два вопроса, один из них почему они выбрали
не делать функции constexpr.

На эту часть очень хорошо ответил Себастьян Редл а также Адам Шай так что не буду ничего добавлять к этому.

И два для такой функции, как sqrt, я мог бы написать свой собственный
constexpr, но что-то вроде sin или cos было бы сложнее, так что есть
прочь вокруг этого.

Да, вы можете написать свою собственную версию constexpr sin, используя расширения этих функций для ряда Тейлора. Взгляните на этот супер крутой репозиторий github, который реализует несколько математических функций в качестве функций constexpr Morwenn / static_math

4