我正在研究一个程序,我正在使用二次公式。这是单击按钮时执行的代码,用于解决问题,
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。我应该在这类事情上使用标签吗?
答案 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
请注意第一个-
前面的bVal
和2 * 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();