私は単純なsine
関数を、C++ 14 constexpr
を使ってコンパイル時に評価できるテイラー級数展開を使って構築しようとしています。私のコードはコンパイルされていますが、コンパイラは定数を生成しません。次のようにconstayprとしてのテイラー級数展開
sine
が定義されています:
template <int P, typename T = double> constexpr T sine(T x) {
T result = x;
for (int i = 1; i < P; ++i)
result += power<T>(-1, i) * power<T>(x, 1 + 2 * i)/factorial<T>(1 + 2 * i);
return result;
}
必要であれば、私はpower
とfactorial
ためのコードを提供することができます。彼らは些細でもあり、またconstexpr
です。私はこのようなループ内からsine
を呼んでいる
:私は、コンパイラはsine
の結果のセットを生成し、実際にテイラー級数を計算するために必要とせずにout
にそれらを置くことができることを期待していた
template <int N> void test(double *out) {
for (int i = 0; i < N; ++i) {
out[i] = sine<20, double>(i * M_PI/N);
}
}
。その代わりに、生成されたコードは、sine
を他の非constexpr
関数のように実行します。
私のコンパイラはXcode 7.2のコンパイルで、-O3
でコンパイルされています。
は、 '私はM_PI/N 'をsine''へ_argument_ *という問題ではなく、ISNコンステックス? – Eric
@Eric "入力引数はすべて定数式でなければなりません。"十分に明確ではありませんか? – 101010
私は "テストのforループの代入は定数式ではありません" _を参照していました。課題そのものはここで問題になっていますか? – Eric