繁体   English   中英

当判别为负时,二次解返回错误的虚解

[英]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); 
        }
    }
}

某个地方是否有错误,或者我是否以某种方式弄乱了方程式?

  1. 您可能应该为imaginaryCheck==0加上一个案例,因为在这种情况下,您只会得到一个解决方案。

  2. 您总是会忘记小数部分的括号,从而使使用的实际公式错误

  3. 最大的问题:您的假想解计算错误。 这不是虚值计算的工作原理。

正确的应该看起来像这样:

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

您必须分别计算实部和虚部-您不能简单地将它们相加。 那将正确输出:

您的第一个解决方案是:-2.00 + 1.00i
您的第二个解决方案是:-2.00 + -1.00i

if -branch的括号应如下所示:

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

原因:因为*和/运算符的优先级高于+和-。 请参阅链接以获取更多详细信息

假设:您对虚部的计算是正确的,即%1.2fi。 如果不确定计算本身,则可以找到虚构的luk2302解。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM