判别式为负时二次returns错虚解的解法
Solution for quadratic returns wrong imaginary solutions when the discriminant is negative
我正在尝试更多地参与编程,这是朋友推荐我做的一件事。我正在尝试编写一个二次求解器,但它给出了错误的答案,但是我们都不知道为什么。
我们以这个等式为例:x^2+4x+5 = 0
它的解是 x=-2+1 和 x=-2-i
Eclipse 控制台显示如下:
Quadratic equation:
Please enter A:
1
Please enter B:
4
Please enter C:
5
Your first solution is: -3.0
Your second solution is: -5.0
这是正在使用的代码:
import java.util.Scanner;
public class Main{
private static Scanner input = new Scanner(System.in);
public static void main(String[] args) {
System.out.println("Quadratic equation: ");
System.out.println("Please enter A: ");
while(!input.hasNextInt()){
@SuppressWarnings("unused")
String broken = input.next();
System.out.println("Please enter A: ");
}
int a = input.nextInt();
System.out.println("Please enter B: ");
while(!input.hasNextInt()){
@SuppressWarnings("unused")
String broken = input.next();
System.out.println("Please enter B: ");
}
int b = input.nextInt();
System.out.println("Please enter C: ");
while(!input.hasNextInt()){
@SuppressWarnings("unused")
String broken = input.next();
System.out.println("Please enter C: ");
}
int c = input.nextInt();
double imaginaryCheck = (b*b)-(4*a*c);
if(imaginaryCheck>0){
double plus = (-b) + Math.sqrt(imaginaryCheck) / (2 * a);
double minus = (-b) - Math.sqrt(imaginaryCheck) / (2 * a);
System.out.format("Your first solution is: %1.2f\n", plus);
System.out.format("Your second solution is: %1.2f", minus);
}else{
double plus = (-b) + Math.sqrt((-1*imaginaryCheck)) / (2 * a);
double minus = (-b) - Math.sqrt((-1*imaginaryCheck)) / (2 * a);
System.out.format("Your first solution is: %1.2fi\n", plus);
System.out.format("Your second solution is: %1.2fi", minus);
}
}
}
是哪里出错了还是我搞错了方程式?
您可能应该为 imaginaryCheck==0
添加一个案例,因为在那种情况下您只能得到一个解决方案。
你总是忘记分数部分的括号导致你使用的实际公式错误
最大的问题:你的假想解计算有误。这不是虚数值的计算方式。
正确的应该是这样的:
double plusReal = (-b) / (double)(2 * a);
double minusReal = (-b) / (double)(2 * a);
double plusImaginary = Math.sqrt(-1 * imaginaryCheck) / (2 * a);
double minusImaginary = -Math.sqrt(-1 * imaginaryCheck) / (2 * a);
System.out.format("Your first solution is: %1.2f + %1.2fi\n", plusReal, plusImaginary);
System.out.format("Your second solution is: %1.2f + %1.2fi", minusReal, minusImaginary);
你必须分别计算实部和虚部——你不能简单地将它们相加。这将正确输出:
Your first solution is: -2.00 + 1.00i
Your second solution is: -2.00 + -1.00i
if
-分支应如下所示,并带有更正的括号:
double plus = ((-b) + Math.sqrt(imaginaryCheck)) / (2 * a);
double minus = ((-b) - Math.sqrt(imaginaryCheck)) / (2 * a);
System.out.format("Your first solution is: %1.2f\n", plus);
System.out.format("Your second solution is: %1.2f", minus);
代码最终应该看起来像
if (imaginaryCheck > 0) {
double plus = (-b + Math.sqrt(imaginaryCheck)) / (2 * a);
double minus = (-b - Math.sqrt(imaginaryCheck)) / (2 * a);
System.out.format("Your first solution is: %1.2f\n", plus);
System.out.format("Your second solution is: %1.2f", minus);
} else if (imaginaryCheck == 0) {
double plus = -b / (double) (2 * a);
System.out.format("Your only solution is: %1.2f\n", plus);
} else {
double plusReal = -b / (double) (2 * a);
double plusImaginary = Math.sqrt(-1 * imaginaryCheck) / (2 * a);
System.out.format("Your first solution is: %1.2f + %1.2fi\n", plusReal, plusImaginary);
System.out.format("Your second solution is: %1.2f - %1.2fi", plusReal, plusImaginary);
}
您需要将计算更改为:
if(imaginaryCheck>0){
double plus = ((-b) + Math.sqrt(imaginaryCheck)) / (2 * a);
double minus = ((-b) - Math.sqrt(imaginaryCheck)) / (2 * a);
System.out.format("Your first solution is: %1.2f\n", plus);
System.out.format("Your second solution is: %1.2f", minus);
}else{
double plus = ((-b) + Math.sqrt((-1*imaginaryCheck))) / (2 * a);
double minus = ((-b) - Math.sqrt((-1*imaginaryCheck))) / (2 * a);
System.out.format("Your first solution is: %1.2fi\n", plus);
System.out.format("Your second solution is: %1.2fi", minus);
}
原因:因为*和/运算符的优先级高于+和-。详情请参考link
假设:您计算的虚部是正确的,即 %1.2fi。如果不确定计算本身,那么 luk2302 求虚解的解就可以了。
我正在尝试更多地参与编程,这是朋友推荐我做的一件事。我正在尝试编写一个二次求解器,但它给出了错误的答案,但是我们都不知道为什么。
我们以这个等式为例:x^2+4x+5 = 0
它的解是 x=-2+1 和 x=-2-i
Eclipse 控制台显示如下:
Quadratic equation:
Please enter A:
1
Please enter B:
4
Please enter C:
5
Your first solution is: -3.0
Your second solution is: -5.0
这是正在使用的代码:
import java.util.Scanner;
public class Main{
private static Scanner input = new Scanner(System.in);
public static void main(String[] args) {
System.out.println("Quadratic equation: ");
System.out.println("Please enter A: ");
while(!input.hasNextInt()){
@SuppressWarnings("unused")
String broken = input.next();
System.out.println("Please enter A: ");
}
int a = input.nextInt();
System.out.println("Please enter B: ");
while(!input.hasNextInt()){
@SuppressWarnings("unused")
String broken = input.next();
System.out.println("Please enter B: ");
}
int b = input.nextInt();
System.out.println("Please enter C: ");
while(!input.hasNextInt()){
@SuppressWarnings("unused")
String broken = input.next();
System.out.println("Please enter C: ");
}
int c = input.nextInt();
double imaginaryCheck = (b*b)-(4*a*c);
if(imaginaryCheck>0){
double plus = (-b) + Math.sqrt(imaginaryCheck) / (2 * a);
double minus = (-b) - Math.sqrt(imaginaryCheck) / (2 * a);
System.out.format("Your first solution is: %1.2f\n", plus);
System.out.format("Your second solution is: %1.2f", minus);
}else{
double plus = (-b) + Math.sqrt((-1*imaginaryCheck)) / (2 * a);
double minus = (-b) - Math.sqrt((-1*imaginaryCheck)) / (2 * a);
System.out.format("Your first solution is: %1.2fi\n", plus);
System.out.format("Your second solution is: %1.2fi", minus);
}
}
}
是哪里出错了还是我搞错了方程式?
您可能应该为
imaginaryCheck==0
添加一个案例,因为在那种情况下您只能得到一个解决方案。你总是忘记分数部分的括号导致你使用的实际公式错误
最大的问题:你的假想解计算有误。这不是虚数值的计算方式。
正确的应该是这样的:
double plusReal = (-b) / (double)(2 * a);
double minusReal = (-b) / (double)(2 * a);
double plusImaginary = Math.sqrt(-1 * imaginaryCheck) / (2 * a);
double minusImaginary = -Math.sqrt(-1 * imaginaryCheck) / (2 * a);
System.out.format("Your first solution is: %1.2f + %1.2fi\n", plusReal, plusImaginary);
System.out.format("Your second solution is: %1.2f + %1.2fi", minusReal, minusImaginary);
你必须分别计算实部和虚部——你不能简单地将它们相加。这将正确输出:
Your first solution is: -2.00 + 1.00i
Your second solution is: -2.00 + -1.00i
if
-分支应如下所示,并带有更正的括号:
double plus = ((-b) + Math.sqrt(imaginaryCheck)) / (2 * a);
double minus = ((-b) - Math.sqrt(imaginaryCheck)) / (2 * a);
System.out.format("Your first solution is: %1.2f\n", plus);
System.out.format("Your second solution is: %1.2f", minus);
代码最终应该看起来像
if (imaginaryCheck > 0) {
double plus = (-b + Math.sqrt(imaginaryCheck)) / (2 * a);
double minus = (-b - Math.sqrt(imaginaryCheck)) / (2 * a);
System.out.format("Your first solution is: %1.2f\n", plus);
System.out.format("Your second solution is: %1.2f", minus);
} else if (imaginaryCheck == 0) {
double plus = -b / (double) (2 * a);
System.out.format("Your only solution is: %1.2f\n", plus);
} else {
double plusReal = -b / (double) (2 * a);
double plusImaginary = Math.sqrt(-1 * imaginaryCheck) / (2 * a);
System.out.format("Your first solution is: %1.2f + %1.2fi\n", plusReal, plusImaginary);
System.out.format("Your second solution is: %1.2f - %1.2fi", plusReal, plusImaginary);
}
您需要将计算更改为:
if(imaginaryCheck>0){
double plus = ((-b) + Math.sqrt(imaginaryCheck)) / (2 * a);
double minus = ((-b) - Math.sqrt(imaginaryCheck)) / (2 * a);
System.out.format("Your first solution is: %1.2f\n", plus);
System.out.format("Your second solution is: %1.2f", minus);
}else{
double plus = ((-b) + Math.sqrt((-1*imaginaryCheck))) / (2 * a);
double minus = ((-b) - Math.sqrt((-1*imaginaryCheck))) / (2 * a);
System.out.format("Your first solution is: %1.2fi\n", plus);
System.out.format("Your second solution is: %1.2fi", minus);
}
原因:因为*和/运算符的优先级高于+和-。详情请参考link
假设:您计算的虚部是正确的,即 %1.2fi。如果不确定计算本身,那么 luk2302 求虚解的解就可以了。