2013-06-26 41 views
1

我有這樣的方法來解決,返回2種所述增量類型的陣列的二次方程(如果小於零個比有複雜的解決方案)問題與EQ複數值解算器的字符串返回

public static final String[] quadEquationSolver(double a, double b, double c) { 
     double delta = (b * b) - 4 * a * c; 
     double q; 
     if (delta < 0) { 
      double deltar = Math.abs(Math.sqrt(delta)); 
      q = ((b < 0) ? -0.5 * (b - deltar) : -0.5 * (b + deltar)); 
      double t0 = q/a; 
      double t1 = c/q; 
      // return sorted array 
      return (t0 > t1) ? new String[] { t1 + "i", t0 + "i" } 
        : new String[] { t0 + "i", t1 + "i" }; 
     } else { 
      double deltar = Math.sqrt(delta); 
      q = ((b < 0) ? -0.5 * (b - deltar) : -0.5 * (b + deltar)); 
      double t0 = q/a; 
      double t1 = c/q; 
      // return sorted array 
      return (t0 > t1) ? new String[] { t1 + "", t0 + "" } 
        : new String[] { t0 + "", t1 + "" }; 
     } 

    } 

不幸時delta<0我得到一個只包含NaNi值,儘管正確的結果String數組,但我不明白爲什麼

回答

1

問題就在這裏:

if (delta < 0) { 
      double deltar = Math.abs(Math.sqrt(delta)); 

delta < 0,Math.sqrt(delta)將返回NaNMath.abs(NaN)也將返回NaN根據API。任何涉及NaN值的後續公式都會產生NaN結果,因此您會看到您看到的結果。

你應該嘗試更換Math.sqrtMath.abs方法調用,以避免像這樣這個問題:

if (delta < 0) { 
      double deltar = Math.sqrt(Math.abs(delta)); 

Java的數學庫不支持複數處理如此。如果您想明確使用複數,您可以嘗試查看Apache Commons Math Library

+0

我在想我怎麼沒注意到這個大錯誤......謝謝! – AndreaF