我在这里感到困惑。我有一个函数返回一个double,有时它会返回正确的值,但大多数时候它返回NaN。根据我的理解,当我们有类似0/0的东西时会返回NaN。下面是返回NaN的函数,它的所有变量都被声明为双精度。
public double SuperiorValue(List<double> l)
{
valueKn[0] = 0;
valueKn[1] = 0;
valueKn[2] = 1.69;
valueKn[3] = 1.18;
valueKn[4] = 0.95;
valueKn[5] = 0.82;
valueKn[6] = 0.75;
valerKn[7] = 0.67;
valueKn[8] = 0.63;
valueKn[9] = 0.58;
valueKn[10] = 0.561;
valueKn[11] = 0.542;
valueKn[12] = 0.523;
valueKn[13] = 0.504;
valueKn[14] = 0.485;
valueKn[15] = 0.466;
valueKn[16] = 0.447;
valueKn[17] = 0.428;
valueKn[18] = 0.409;
valueKn[19] = 0.39;
valueKn[20] = 0.382;
Xm = (l.Sum()) / (l.Count);
for (int i = 0; i < l.Count; i++)
{
sumTemporary = l[i] - Xm;
sum = sum + sumTemporary;
}
kn = valueKn[l.Count];
sx = Math.Sqrt((1 / l.Count - 1) * (sum * sum));
Vx = sx / Xm;
Xksup = Xm * (1 + kn * Vx);
Xkinf = Xm * (1 - kn * Vx);
return Xksup;
}
更令我感到困惑的是,列表从不是由少于3个元素组成且大于15,并且它仍然经常返回NaN,但就像我说的那样,它有时会返回正确的值。有什么想法吗?
答案 0 :(得分:6)
看看
Math.Sqrt((1 / l.Count - 1) * (sum * sum))
1 / l.Count
是整数除法,对于所有0
,它将是l.Count > 1
,然后您正在计算Sqrt(-1 * (sum * sum))
。
但(1.0 / l.Count - 1)
仍然是否定的,您可能需要(1.0 / (l.Count - 1))
然后修复:
Math.Sqrt((1.0 / (l.Count - 1)) * (sum * sum))