2011-08-05 4 views
1

내가 3 개 double의 소요 차 공식을 통해 뿌리를 계산하는 방법이 있습니다상상 숫자

public static double[] quadraticFormula(double a, double b, double c) throws ArithmeticException { 
    double root1 = 0; 
    double root2 = 0; 

    //sqrt(b^2 - 4ac) 
    double discriminant = (b * b) - (4 * a * c); 

    if (Double.isNaN(discriminant)) { 
     throw new ArithmeticException(discriminant + " is not a number!"); 
    } 

    if (discriminant > 0) { 
     //Two roots 
     root1 = (-b + Math.sqrt(discriminant))/(2 * a); 
     root2 = (-b - Math.sqrt(discriminant))/(2 * a); 
    } else if (discriminant == 0) { 
     //One root 
     root1 = (-b + Math.sqrt(discriminant))/(2 * a); 
    } else if (discriminant < 0) { 
     //Imaginary roots 
    } 

    return new double[] { root1, root2 }; 
} 

나는이에 확장 및 허수에 대한 지원을 추가 할 수 있습니다. 나는 어떻게 이것을 성취 할 것인가? 내 첫 번째 생각은 else if (discriminant < 0)에 있었고, 나는 판별 자의 절대적인 가치를 얻고 급진적 인 요인이었습니다. 나는 사용자에게 뿌리를 출력 할 것이므로 으로 귀찮게하지 말고 정확하게 어디에 넣을 지 알고있는 String 파서를 가지고있다. . 보다 효율적인 방법에 대한 아이디어가 있습니까?

+0

수식은 sqrting하기 전에 판별 자에 -1을 곱한 것을 제외하면 거의 동일합니다. 그리고 나서 이것은 실수 부분 인 -b/2a의 허수 부분입니다. 난 당신이 진짜 복잡한 번호 클래스를 사용하지 않고 더 나은 방법을 얻을 수 있을지 의심. 그리고 코드는 매우 간단해야하지만 복잡한 숫자 클래스가이 간단한 예제에서 필요한 것보다 훨씬 많은 작업을 수행 할 수 있기 때문에 효율성이 떨어질 수 있습니다. – Chris

+0

이것은 귀하의 질문과 직접적인 관련이없는 사소한 의견입니다. 메소드는 {0d, 0d}를 반환 할 수 있지만 호출자는 실제 루트를 2, 1 또는 0으로 반환하는지 여부를 알 수 없습니다. double 대신 Double을 사용하면 null로 초기화 할 수 있습니다. 그러면 계약은 실제 뿌리를 두 배로, 상상의 뿌리를 null로 반환하는 것입니다. 물론 복소수를 반환하면이 표현 문제를 피할 수 있습니다. – rajah9

+0

@ rajah9이 메서드를 호출하는 클래스의 배열을 검사합니다. –

답변

3

복소수/상상적인 숫자를 실제로 사용하려면 복소수를 나타내는 클래스를 구현하는 것이 좋습니다. 그것에 대해

예는 여기에서 찾을 수 있습니다 : 당신은 어떻게 든 두 배, 배열 및 문자열의 혼합물의 당신의 계산을 빌드하는 경우 http://www.math.ksu.edu/~bennett/jomacg/c.html

그것은 definetely 잠시 후 혼란스러워 할 것이다.

+0

정확하게 내가 쓴 것. 이것은 객체 지향적이지 않습니다. –

+0

@ 마우로 : 당신이 quadraticFormula의 절차 버전을 가지고 있기 때문에 그것은 객체 지향적이라고 느끼지 않습니다. 문제는 복잡한 숫자 클래스가 객체 지향적이지 않다는 것이 아닙니다. Number 클래스 (그 중 ComplexNumber는 부속 유형이 될 수 있음)를 가질 수 있고이를 다항 클래스에 사용할 수 있습니다. 그러면 다항식은 List getRoots()를 가질 수 있습니다. 당신은 다항식을 만들고 뿌리를 물을 것입니다. 이것은 객체 지향적 일 것입니다, 네? 그것은 또한 상당히 번거 롭다. 그러나 아니요, 객체 지향적이지 않은 부분은 복소수 클래스가 아닙니다. – ccoakley