2014-01-17 23 views
4

我正在研究一個程序,並且使用二次公式。這是當一個按鈕被點擊,解決問題執行的代碼,二次方程式返回一個錯誤

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,其中實際的數學發生。不過,我不太確定有什麼問題。正如你所看到的,這些數字是雙打的,並且被初始化了,所以它們不是空的,或者是截斷的。當我運行程序並輸入一個b,c和6,4和3的值時,負責輸出負值和正值的xPos和xNeg標籤只顯示NaN。我應該使用這種標籤嗎?

+0

你檢查,以確保該Convert.ToDouble發揮預期?您是否嘗試過使用Double.Parse或Double.TryParse? – Dweeberly

+0

你試圖效仿的確切公式是什麼? – tinstaafl

+2

看起來有人應該嘗試理解二次公式。你給的例子,比如6x^2 + 4x + 3沒有真正的根。你還期望什麼,但NaN? – Alec

回答

6

Math.Pow(bVal, 2) - (4 * aVal * cVal)結果是-56爲6,4的輸入值,和3.當得到你取得結果NaN負的Sqrt

您還需要使用正確的公式。你應該有:

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表示常量,因爲這告訴編譯器你正在使用雙打。如果你不這樣做,很容易得到不正確的結果。

+0

哦,鵝,我不能相信我錯過了。大聲笑,謝謝你指出,我想我已經如此包裹的問題,我沒有注意。 – emufossum13

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();