Averages/Simple moving average: Difference between revisions
Content added Content deleted
(→{{header|D}}: replaced incorrect version) |
|||
Line 284: | Line 284: | ||
=={{header|D}}== |
=={{header|D}}== |
||
⚫ | |||
This should work properly for any types that act like numerics. |
|||
⚫ | |||
import std.string; |
|||
T delegate(T) Sma(T)(int period) { |
|||
class MovingAvg(T) { |
|||
T[] |
T[] data = new T[](period); |
||
T drop, sum = cast(T) 0 ; |
|||
int index, filled, count ; |
|||
MovingAvg!(T) add(T input) { |
|||
elements ~= input; |
|||
foreach(ref e ; data) e = cast(T)0 ; // D initialize float type to NaN |
|||
⚫ | |||
T smaAcc(T v) { |
|||
drop = data[index] ; |
|||
data[index] = v ; |
|||
index = (index + 1) % period ; |
|||
sum += ( v - drop ) ; |
|||
int start = (elements.length-window<0?elements.length:elements.length-window); |
|||
if(filled >= period) |
|||
count = period ; |
|||
⚫ | |||
return sum/(elements.length-start); |
|||
count = ++filled ; |
|||
⚫ | |||
⚫ | |||
return &smaAcc ; |
|||
} |
} |
||
void main() { |
|||
⚫ | |||
auto s3 = Sma!(double)(3) ; |
|||
auto s5 = Sma!(double)(5) ; |
|||
⚫ | |||
writefln("Average number %d is %s",index,toString(mavg.add(num).getAvg)); |
|||
writefln("added %d , 3 period sma = %f , 5 period sma = %f", e, s3(e), s5(e)) ; |
|||
⚫ | |||
⚫ | |||
}</lang> |
}</lang> |
||