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


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

3   51   2013-06-27 20:00:30

3 ответа:

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

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

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

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

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

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

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

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