web-dev-qa-db-ja.com

Constexpr数学関数

これから page に気づかれたのは、c ++ 11の数学関数はどれもconstexprを使用していないようですが、すべての可能性があると私は考えています。つまり、2つの質問が残ります。1つは、関数をconstexprにしないことにした理由です。 sqrtのような関数の場合は2つですが、おそらく自分でconstexprを作成できますが、sinやcosのようなものは扱いにくいので、回避策はあります。

56
aaronman

実際には、古くて迷惑なレガシーのため、数学関数のほとんどがconstexprになることはありません。これらはすべて、さまざまなエラー条件(通常はドメインエラー)にerrnoを設定するという副作用があるためです。

57
Sebastian Redl

B. Stroustrupによる「C++プログラミング言語(第4版)」から、C++ 11について説明します。

"コンパイル時に評価するには、関数は適切に単純である必要があります。constexpr関数は単一のreturn-statementで構成する必要があります。ループもローカル変数も許可されません。また、constexpr関数にはサイドがない場合があります。効果」

つまり、for、while、ifステートメントとローカル変数なしで、インラインでなければなりません。副作用も禁止されています(例:errnoの変更)。もう1つの問題は、ほとんどの数学関数がFPU命令であり、純粋なc/c ++では表現されない(アセンブラコードで記述されている)ことです。そのため、cmath関数以外がconstexprとして宣言されています。

9
Adam Szaj

このページから、c ++ 11の数学関数はどれもconstexprを使用していないようですが、すべての可能性があると思います。つまり、2つの質問が残ります。1つは、関数をconstexprにしないことにした理由です。

この部分はSebastian RedlAdam Szajによって非常によく回答されているので、勝ちました何も追加しないでください。

そして、sqrtのような関数の2つは、おそらく私自身のconstexprを書くことができますが、sinやcosのようなものはトリッキーなので、その周りにあります。

はい、これらの関数のテイラー級数展開を使用して、独自のバージョンのconstexpr sin、cosを記述できます。いくつかの数学関数をconstexpr関数として実装するこの非常にクールなgithubリポジトリをご覧ください Morwenn/static_math

4
Lakshay Garg