これから page に気づかれたのは、c ++ 11の数学関数はどれもconstexprを使用していないようですが、すべての可能性があると私は考えています。つまり、2つの質問が残ります。1つは、関数をconstexprにしないことにした理由です。 sqrt
のような関数の場合は2つですが、おそらく自分でconstexprを作成できますが、sinやcosのようなものは扱いにくいので、回避策はあります。
実際には、古くて迷惑なレガシーのため、数学関数のほとんどがconstexpr
になることはありません。これらはすべて、さまざまなエラー条件(通常はドメインエラー)にerrno
を設定するという副作用があるためです。
B. Stroustrupによる「C++プログラミング言語(第4版)」から、C++ 11について説明します。
"コンパイル時に評価するには、関数は適切に単純である必要があります。constexpr関数は単一のreturn-statementで構成する必要があります。ループもローカル変数も許可されません。また、constexpr関数にはサイドがない場合があります。効果」
つまり、for、while、ifステートメントとローカル変数なしで、インラインでなければなりません。副作用も禁止されています(例:errnoの変更)。もう1つの問題は、ほとんどの数学関数がFPU命令であり、純粋なc/c ++では表現されない(アセンブラコードで記述されている)ことです。そのため、cmath関数以外がconstexprとして宣言されています。
このページから、c ++ 11の数学関数はどれもconstexprを使用していないようですが、すべての可能性があると思います。つまり、2つの質問が残ります。1つは、関数をconstexprにしないことにした理由です。
この部分はSebastian RedlとAdam Szajによって非常によく回答されているので、勝ちました何も追加しないでください。
そして、sqrtのような関数の2つは、おそらく私自身のconstexprを書くことができますが、sinやcosのようなものはトリッキーなので、その周りにあります。
はい、これらの関数のテイラー級数展開を使用して、独自のバージョンのconstexpr sin、cosを記述できます。いくつかの数学関数をconstexpr関数として実装するこの非常にクールなgithubリポジトリをご覧ください Morwenn/static_math