Sto provando a creare una semplice funzione sine
utilizzando l'espansione di taylor series che può essere valutata in fase di compilazione utilizzando C++ 14 constexpr
. Il mio codice è in fase di compilazione, ma il compilatore non genera una costante.Espansione serie Taylor come constexpr
sine
è definito come segue:
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;
}
posso fornire il codice per power
e factorial
se necessario. Sono banali e anche constexpr
.
Sto chiamando da sine
all'interno di un ciclo come questo:
template <int N> void test(double *out) {
for (int i = 0; i < N; ++i) {
out[i] = sine<20, double>(i * M_PI/N);
}
}
mi aspettavo che il compilatore può generare una serie di risultati per sine
e metterli in out
senza in realtà aver bisogno di calcolare la serie di Taylor . Invece il codice generato esegue sine
come se fosse una qualsiasi altra funzione non constexpr
.
Il mio compilatore è clang da Xcode 7.2 che compila con -O3
.
non è il problema che la _argument_ a 'sine',' i * M_PI/N', isn è un constexpr? – Eric
@Eric "Tutti i suoi argomenti di input devono essere espressioni costanti." non è abbastanza chiaro? – 101010
Mi riferivo a _ "L'assegnazione nel ciclo for del test non è un'espressione costante" _. L'incarico è di per sé un problema qui? – Eric