Constexpr Math Functions

C++C++11ConstexprCmath

C++ Problem Overview


So noticed from this page that none of the math functions in c++11 seems to make use of constexpr, whereas I believe all of them could be. So that leaves me with two questions, one is why did they choose not to make the functions constexpr. And two for a function like sqrt I could probably write my own constexpr, but something like sin or cos would be trickier so is there a way around it.

C++ Solutions


Solution 1 - C++

Actually, because of old and annoying legacy, almost none of the math functions can be constexpr, since they all have the side-effect of setting errno on various error conditions, usually domain errors.

Solution 2 - C++

From "The C++ Programming Language (4th Edition)", by B. Stroustrup, describing C++11:

> "To be evaluated at compile time, a function must be suitably simple: a constexpr function must consist of a single return-statement; no loops, and no local variables are allowed. Also, a constexpr function may not have side effects."

Which means that it must be inline, without for, while and if statements and local variables. Side effects are also forbidden (ex: changing of errno). Another problem is that most of math functions are FPU instructions which are not represented in pure c/c++ (they are written in assembler code). That's why non of cmath function is declared as constexpr.

Solution 3 - C++

> So noticed from this page that none of the math functions in c++11 > seems to make use of constexpr, whereas I believe all of them could > be. So that leaves me with two questions, one is why did they choose > not to make the functions constexpr.

This part is very well answered by Sebastian Redl and Adam Szaj so won't be adding anything to it.

> And two for a function like sqrt I could probably write my own > constexpr, but something like sin or cos would be trickier so is there > away around it.

Yes, you can write your own version of constexpr sin, cos by using the taylor series expansions of these functions. Have a look at this super cool github repo which implements several mathematical functions as constexpr functions Morwenn/static_math

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionaaronmanView Question on Stackoverflow
Solution 1 - C++Sebastian RedlView Answer on Stackoverflow
Solution 2 - C++Adam SzajView Answer on Stackoverflow
Solution 3 - C++lakshaygView Answer on Stackoverflow