Почему коренным результатом квадратного уравнения является NaN? (Джава) - PullRequest
3 голосов
/ 18 сентября 2011

Зачем писать Корни NaN и NaN в консоли?Я читал о NaN, но не могу найти правильного решения, как я могу исправить ошибки ... Я пробовал приведение к удвоению дискриминанта и корни но не работает.Может ли кто-нибудь помочь мне, где и что мне нужно переписать?

public static void main(String args[]) {
    Scanner sc = new Scanner(System.in);
    Pattern newlineOrSpace = Pattern.compile(System
            .getProperty("line.separator")
            + "|\\s");
    sc.useDelimiter(newlineOrSpace);
    System.out.print("Enter a, b, c: ");
    double a = sc.nextDouble();
    double b = sc.nextDouble();
    double c = sc.nextDouble();
    // System.out.format("a = %f, b = %f, c = %f", a, b, c);

    double root1;
    double root2;
    double discriminant;
    discriminant = Math.sqrt(b * b - 4 * a * c);
    if (discriminant > 0) {
        System.out.println("There are no real roots ");
    } else {
        root1 = (-b + discriminant) / (2 * a);
        root2 = (-b - discriminant) / (2 * a);
        System.out.println("The roots are " + root1 + " and " + root2);
    }

Ответы [ 4 ]

7 голосов
/ 18 сентября 2011

Math.sqrt(x) возвращает NaN, когда x отрицательно, что затем распространяется через весь остальной код. Вы хотите проверить наличие отрицательных чисел перед тем, как примет квадратный корень:

discriminant = b * b - 4 * a * c;
if (discriminant < 0) {
    System.out.println("There are no real roots ");
} else {
    root1 = (-b + Math.sqrt(discriminant)) / (2 * a);
    root2 = (-b - Math.sqrt(discriminant)) / (2 * a);
    System.out.println("The roots are " + root1 + " and " + root2);
}
6 голосов
/ 18 сентября 2011

Во-первых, давайте избавимся от пользовательского ввода как причины для этого - намного проще, если бы короткая, но полная программа содержала все необходимые нам данные:

public class Test {
    public static void main(String args[]) {
        showRoots(2.0, 10.0, 2.0);
        showRoots(10.0, 1.0, 1.0);
    }

    private static void showRoots(double a, double b, double c) {
        double discriminant = Math.sqrt(b * b - 4 * a * c);
        if (discriminant > 0) {
            System.out.println("There are no real roots ");
        } else {
            double root1 = (-b + discriminant) / (2 * a);
            double root2 = (-b - discriminant) / (2 * a);
            System.out.println("The roots are " + root1 + " and " + root2);
        }
    }
}

Это показывает два случая - один, где естьна самом деле являются корнями - но программа утверждает, что их нет - и тот, где действительно не являются настоящими корнями, но программа выводит их как NaN.Когда вы берете квадратный корень из отрицательного числа, результат равен NaN, поэтому он отображается.

Итак, проблема в том, как вы справляетесь с дискриминантом.Существуют настоящие корни, если b 2 - 4ac неотрицателен - но вы уже взяли квадратный корень в этой точке и полностью изменили природуусловие.

Итак, это должно быть:

private static void showRoots(double a, double b, double c) {
    double discriminant = b * b - 4 * a * c;
    if (discriminant < 0) {
        System.out.println("There are no real roots ");
    } else {
        double discriminantRoot = Math.sqrt(discriminant);
        double root1 = (-b + discriminantRoot) / (2 * a);
        double root2 = (-b - discriminantRoot) / (2 * a);
        System.out.println("The roots are " + root1 + " and " + root2);
    }
}

Уроки для изучения:

  • Если вы хотите продемонстрировать проблему, она помогает сохранить ее минимальной;использование жестко закодированных значений - хороший способ сделать это
  • Будьте осторожны с порядком операций - в этом случае вы пытались определить что-то, используя неправильное значение, потому что вы слишком рано взяли квадратный корень
  • Будьте осторожны с условиями и правильно ли вы их понимаете

РЕДАКТИРОВАТЬ: Как отмечено в комментариях, есть также различные особые случаи, которые следует учитывать, в том числе когдаa равно 0, что в противном случае привело бы к делению на 0.

1 голос
/ 18 сентября 2011

Вы получаете это, когда ваш дискриминант отрицателен.Как и для a = 1, b = 2, c = 3.Дельта = 2 * 2 -4 * 1 * 3 = 4 - 12 = -8

Java не может вычислить квадратный корень из отрицательного числа, она не знает о мнимом числе i.

1 голос
/ 18 сентября 2011

Do

double discriminant = b * b - 4 * a * c; 
if (discriminant >= 0) {
    discriminant = Math.sqrt(discriminant);  
    root1 = (-b + discriminant) / (2 * a);          
    root2 = (-b - discriminant) / (2 * a);          
    System.out.println("The roots are " + root1 + " and " + root2);      
} 
else {
    System.out.println("There are no real roots ");  
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...