二次公式返回错误

时间:2014-01-17 03:35:09

标签: c#

我正在研究一个程序,我正在使用二次公式。这是单击按钮时执行的代码,用于解决问题,

private void button1_Click(object sender, EventArgs e)
{
    double aVal, bVal, cVal, xVal1, xVal2;
    xVal1 = 0;
    xVal2 = 0;
    aVal = Convert.ToDouble(a.Text);
    bVal = Convert.ToDouble(b.Text);
    cVal = Convert.ToDouble(c.Text);
    xVal1 = (bVal + Math.Sqrt(Math.Pow(bVal, 2) - (4 * aVal * cVal))) / 2 * aVal; //Positive Calculation
    xVal2 = (bVal - Math.Sqrt(Math.Pow(bVal, 2) - (4 * aVal * cVal))) / 2 * aVal; //Negative Calculation
    xPos.Text = Convert.ToString(xVal1);
    xNeg.Text = Convert.ToString(xVal2);
}

经过一些调试后,我相信我已将问题缩小到第9行和第10行,实际数学发生在第9行和第10行。但是,我不太确定是什么问题。如您所见,数字是双精度数,并且已初始化,因此它们不为空或截断。当我运行程序并输入b和c值say,6,4和3时,负责输出负值和正值的xPos和xNeg标签只显示NaN。我应该在这类事情上使用标签吗?

2 个答案:

答案 0 :(得分:6)

对于输入值为6,4和3,Math.Pow(bVal, 2) - (4 * aVal * cVal)的结果为-56。当您获得结果的Sqrt时,您会得到结果NaN

您还需要使用正确的公式。你应该:

var sqrt = Math.Sqrt(Math.Pow(bVal, 2.0) - (4.0 * aVal * cVal));
var xVal1 = (-bVal + sqrt) / (2.0 * aVal); //Positive Calculation
var xVal2 = (-bVal - sqrt) / (2.0 * aVal); //Negative Calculation

请注意第一个-前面的bVal2 * aVal周围的括号。

我还用.0表示常量,因为这告诉编译器你正在使用双精度数。如果不这样做,很容易得到错误的结果。

答案 1 :(得分:0)

    public static double[] SolveQuadratic(double a, double b, double c)
    {
        return new[]
        {
            (-b + Math.Sqrt(b*b - 4*a*c))/2*a,
            (-b - Math.Sqrt(b*b - 4*a*c))/2*a
        };
    }

然后做:

        double x1Val = SolveQuadratic(a, b, c)[0];
        double x2Val = SolveQuadratic(a, b, c)[1];

        textX1.Text = x1Val.ToString();
        textX2.Text = x2Val.ToString();