Averages/Simple moving average: Difference between revisions

Content added Content deleted
(Updated both D entry)
Line 726: Line 726:


auto sma(T, int period)() {
auto sma(T, int period)() {
T[period] data = 0; // D FP are default-initialized to NaN
T[period] data = 0;
T sum = 0;
T sum = 0;
int index, nfilled;
int index, nFilled;


// return (in T v) nothrow {
return (in T v) nothrow {
return delegate (in T v) nothrow {
sum += -data[index] + v;
sum += -data[index] + v;
data[index] = v;
data[index] = v;
index = (index + 1) % period;
index = (index + 1) % period;
nfilled = min(period, nfilled + 1);
nFilled = min(period, nFilled + 1);
return cast(CommonType!(T, float))sum / nfilled;
return CommonType!(T, float)(sum) / nFilled;
};
};
}
}


void main() {
void main() {
auto s3 = sma!(int, 3)();
immutable s3 = sma!(int, 3);
auto s5 = sma!(double, 5)();
immutable s5 = sma!(double, 5);


foreach (e; [1, 2, 3, 4, 5, 5, 4, 3, 2, 1])
foreach (immutable e; [1, 2, 3, 4, 5, 5, 4, 3, 2, 1])
writefln("Added %d, sma(3) = %f, sma(5) = %f",
writefln("Added %d, sma(3) = %f, sma(5) = %f",
e, s3(e), s5(e));
e, s3(e), s5(e));
Line 759: Line 758:
Added 2, sma(3) = 3.000000, sma(5) = 3.800000
Added 2, sma(3) = 3.000000, sma(5) = 3.800000
Added 1, sma(3) = 2.000000, sma(5) = 3.000000</pre>
Added 1, sma(3) = 2.000000, sma(5) = 3.000000</pre>

===Using a Struct===
===Using a Struct===
This version avoids the heap allocation of the closure, same output:
This version avoids the heap allocation of the closure, same output:
Line 766: Line 766:
T[period] data = 0;
T[period] data = 0;
T sum = 0;
T sum = 0;
int index, nfilled;
int index, nFilled;


auto opCall(in T v) pure nothrow {
auto opCall(in T v) pure nothrow {
Line 772: Line 772:
data[index] = v;
data[index] = v;
index = (index + 1) % period;
index = (index + 1) % period;
nfilled = min(period, nfilled + 1);
nFilled = min(period, nFilled + 1);
return cast(CommonType!(T, float))sum / nfilled;
return CommonType!(T, float)(sum) / nFilled;
}
}
}
}
Line 781: Line 781:
SMA!(double, 5) s5;
SMA!(double, 5) s5;


foreach (e; [1, 2, 3, 4, 5, 5, 4, 3, 2, 1])
foreach (immutable e; [1, 2, 3, 4, 5, 5, 4, 3, 2, 1])
writefln("Added %d, sma(3) = %f, sma(5) = %f",
writefln("Added %d, sma(3) = %f, sma(5) = %f",
e, s3(e), s5(e));
e, s3(e), s5(e));