내가 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 파서를 가지고있다. . 보다 효율적인 방법에 대한 아이디어가 있습니까?
수식은 sqrting하기 전에 판별 자에 -1을 곱한 것을 제외하면 거의 동일합니다. 그리고 나서 이것은 실수 부분 인 -b/2a의 허수 부분입니다. 난 당신이 진짜 복잡한 번호 클래스를 사용하지 않고 더 나은 방법을 얻을 수 있을지 의심. 그리고 코드는 매우 간단해야하지만 복잡한 숫자 클래스가이 간단한 예제에서 필요한 것보다 훨씬 많은 작업을 수행 할 수 있기 때문에 효율성이 떨어질 수 있습니다. – Chris
이것은 귀하의 질문과 직접적인 관련이없는 사소한 의견입니다. 메소드는 {0d, 0d}를 반환 할 수 있지만 호출자는 실제 루트를 2, 1 또는 0으로 반환하는지 여부를 알 수 없습니다. double 대신 Double을 사용하면 null로 초기화 할 수 있습니다. 그러면 계약은 실제 뿌리를 두 배로, 상상의 뿌리를 null로 반환하는 것입니다. 물론 복소수를 반환하면이 표현 문제를 피할 수 있습니다. – rajah9
@ rajah9이 메서드를 호출하는 클래스의 배열을 검사합니다. –