Averages/Simple moving average: Difference between revisions

Content added Content deleted
(→‎{{header|D}}: replaced incorrect version)
Line 284: Line 284:


=={{header|D}}==
=={{header|D}}==
<lang d>import std.stdio ;
This should work properly for any types that act like numerics.
<lang d>import std.stdio;
import std.string;


T delegate(T) Sma(T)(int period) {
class MovingAvg(T) {
T[]elements;
T[] data = new T[](period);
int window = 5;
T drop, sum = cast(T) 0 ;
int index, filled, count ;
MovingAvg!(T) add(T input) {

elements ~= input;
return this;
foreach(ref e ; data) e = cast(T)0 ; // D initialize float type to NaN

}
void setWindow(int win) {window = win;}
T smaAcc(T v) {
T getAvg() {
drop = data[index] ;
if (!window) return 0;
data[index] = v ;
T sum = 0;
index = (index + 1) % period ;
sum += ( v - drop ) ;
int start = (elements.length-window<0?elements.length:elements.length-window);
if (start == elements.length) return 0;
if(filled >= period)
foreach(ele;elements[start..$]) {sum += ele;}
count = period ;
else
return sum/(elements.length-start);
}
count = ++filled ;
return sum / count;
}

return &smaAcc ;
}
}



int main() {
void main() {
double[]nums = [1, 2, 3, 4, 5, 5, 4, 3, 2, 1];
auto mavg = new MovingAvg!(double);
auto s3 = Sma!(double)(3) ;
foreach(index,num;nums) {
auto s5 = Sma!(double)(5) ;
foreach(e ; [1, 2, 3, 4, 5, 5, 4, 3, 2, 1])
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)) ;
}

return 0;
}</lang>
}</lang>