Averages/Simple moving average: Difference between revisions
Content added Content deleted
m (→{{header|Objective-C}}: modernize) |
(Updated both D entry) |
||
Line 726: | Line 726: | ||
auto sma(T, int period)() { |
auto sma(T, int period)() { |
||
T[period] data = 0; |
T[period] data = 0; |
||
T sum = 0; |
T sum = 0; |
||
int index, |
int index, nFilled; |
||
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); |
|||
return |
return CommonType!(T, float)(sum) / nFilled; |
||
}; |
}; |
||
} |
} |
||
void main() { |
void main() { |
||
immutable s3 = sma!(int, 3); |
|||
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, |
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); |
|||
return |
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)); |