公式
代码
说明:
因为double类型的加减乘除有小数点问题,所有做了这4个运算的类型转换处理.方法可自行百度
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Spc.Core
{
/// <summary>
/// 移动极差平均值方法
/// </summary>
public class MovingRangeAverageEstimateSigma : IEstimateSigma
{
public double GetSigma(double[] vs, bool useUnbiasedConstant = false, int sampleSize = 0, int movingRangeLength = 2)
{
var w = movingRangeLength;
int h;
var sum = 0d;
double sigma;
for (int i = w; i <= vs.Length; i++)
{
h = i - w + 1;
var s = vs.Skip(h - 1).Take(w);
sum = sum.Add(s.Max().Sub(s.Min()));
//sum += (double)((decimal)s.Max() - (decimal)s.Min());
}
sigma = sum.Div(vs.Length - w + 1);
//sigma = (double)((decimal)sum / (vs.Length - w + 1));
if (useUnbiasedConstant)
{
//sigma = (double)((decimal)sigma / (decimal)SigmaConstants.D2(w));
sigma = sigma.Div(SigmaConstants.D2(w));
}
return sigma;
}
public double GetSigma(double[][] vs, bool useUnbiasedConstant = false, int sampleSize = 0, int movingRangeLength = 2)
{
throw new NotImplementedException();
}
}
}
double 类型运算扩展方法
public static class DoubleExtend
{
/// <summary>
/// 加
/// </summary>
/// <param name="d"></param>
/// <param name="n"></param>
/// <returns></returns>
public static Double Add(this Double d, double n)
{
return (double)((decimal)d + (decimal)n);
}
/// <summary>
/// 减
/// </summary>
/// <param name="d"></param>
/// <param name="n"></param>
/// <returns></returns>
public static Double Sub(this Double d, double n)
{
return (double)((decimal)d - (decimal)n);
}
/// <summary>
/// 乘
/// </summary>
/// <param name="d"></param>
/// <param name="n"></param>
/// <returns></returns>
public static Double Mul(this Double d, double n)
{
return (double)((decimal)d * (decimal)n);
}
/// <summary>
/// 除
/// </summary>
/// <param name="d"></param>
/// <param name="n"></param>
/// <returns></returns>
public static Double Div(this Double d, double n)
{
return (double)((decimal)d / (decimal)n);
}
}