双回NaN但不是所有的时间

时间:2015-05-15 14:08:31

标签: c# .net wpf

我在这里感到困惑。我有一个函数返回一个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,但就像我说的那样,它有时会返回正确的值。有什么想法吗?

1 个答案:

答案 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))