Ben C++ 14 constexpr
kullanarak derleme zamanında değerlendirilebilen taylor seri genişletme kullanarak basit bir sine
işlevini oluşturmaya çalışıyorum. Kodum derleniyor, ancak derleyici sabit oluşturmuyor. GerekirseConstexpr olarak Taylor serisi genişletme
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;
}
I power
için kod sağlamak ve factorial
aşağıdaki şekilde gösterilir:
sine
tanımlanır. Onlar önemsiz ve ayrıca constexpr
. Böyle bir döngü içinde sine
arıyorum
: Ben derleyici sine
ilişkin sonuçların bir dizi üretmek ve aslında Taylor serisi hesaplamak gerek kalmadan out
içine koydu ki bekliyordum
template <int N> void test(double *out) {
for (int i = 0; i < N; ++i) {
out[i] = sine<20, double>(i * M_PI/N);
}
}
. Bunun yerine, oluşturulan kod sine
'u constexpr
dışındaki herhangi bir işlev gibi çalıştırır.
Derleyicim, Xcode 7.2'den gelen ve -O3
ile derlenen bir dizedir.
, 'i M_PI/n 'sine'' etmek _argument_ * o sorun değil mi, değil Bir Constekspr? – Eric
@Eric "Tüm giriş argümanları sabit ifadeler olmalıdır." yeterince açık değil mi? – 101010
_ "Testin döngüdeki ataması sabit bir ifade değildir" _ ifadesini kullandım. Ödevin kendisi burada bir sorun mu var? – Eric