2013-04-16 4 views
0

Итак, я полный Java noob, и я пытаюсь создать программу для класса, которая запускает квадратичное уравнение с использованием входов сканера. До сих пор, что у меня есть это:квадратичная формула со вставками сканера

import java.util.*; 

public class QuadraticFormulaSCN { 


public static void main(String[]args) { 
    System.out.println("insert value for a:"); 
    Scanner scan1 = new Scanner(System.in); 
    double a = scan1.nextDouble(); 
    System.out.println("insert value for b:"); 
    Scanner scan2 = new Scanner(System.in); 
    double b = scan2.nextDouble(); 
    System.out.println("insert value for C:"); 
    Scanner scan3 = new Scanner(System.in); 
    double c = scan3.nextDouble(); 

    double answer =((Math.sqrt(Math.pow(b,2)-(4*a*c))-b)/2); 
     double final2 =(-b + Math.sqrt(Math.pow(b,2)-(4*a*c)))/2; 
    System.out.println("The x values are:" + answer + final2); 
} 
} 

Но я получаю странный результат, а именно NaNaN ... Что мне делать, чтобы исправить это? Что я делаю не так?

+2

Вы должны использовать только один «Сканер». – syb0rg

+0

Кроме того, это поможет вам, если вы (по крайней мере для целей тестирования) избегаете однострочного кода и отделяете исчисление от нескольких переменных, что упрощает отладочную печать. Во всяком случае, уверены ли вы, что у установленного уравнения есть хотя бы одно решение (и, IMHO, вы должны попытаться напечатать оба решения, если они существуют). – SJuan76

ответ

2

NaN - это то, что вы получаете, когда расчет недействителен. Например, деление на 0 или принятие squareroot -1.

Когда я проверить код с a = 1, b = 0 и c = -4 ответов является 2.02.0

форматирование не является правильным и расчет final2 не отрицается.

В противном случае код является правильным.

Чтобы улучшить, вы можете проверить, является ли дискриминант отрицательным.

double d = b*b -4 * a * c; 
if (d < 0){ 
    System.out.println("Discriminant < 0, no real solutions"); 
    return; 
} 
double x1 = (-b -sqrt(d))/(2*a); 
double x2 = (-b +sqrt(d))/(2*a); 
System.out.format("The roots of your quadratic formula are %5.3f and %5.3f\n",x1,x2); 

Или, если вы предпочитаете поддержку решений от комплексной области:

if (d < 0) { 
    System.out.println("Discriminant < 0, only imaginary solutions"); 
    double r = -b/(2 * a); 
    double i1 = -sqrt(-d)/(2/a); 
    double i2 = sqrt(-d)/(2/a); 
    System.out.format("The roots of your quadratic formula are (%5.3f + %5.3fi) and (%5.3f + %5.3fi)\n",r, i1, r, i2); 
    return; 
} 
1

Вы получаете NaN, потому что вы пытаетесь извлечь квадратный корень из отрицательного числа. В математике это недопустимо, если вы не разрешаете сложные числа, например. 1 +/- 2i.

Это может произойти в квадратичных формулах, когда дискриминант (вещь в квадратном корне) отрицателен, например. x^2 + 6*x + 100: b^2 - 4ac = 36 - 400 = -364. Принимая квадратный корень отрицательного числа in Java leads to NaN. (не номер)

Для проверки на предмет NaN используйте Double.isNaN и соответствующим образом обработайте NaN.

Кроме того, ваши расчеты неверны, даже если NaN не встречаясь:

$ java QuadraticFormulaSCN 
insert value for a: 
1 
insert value for b: 
5 
insert value for C: 
6 
The x values are:-2.0-2.0 

Это должно выводимый 2.0 и 3.0

0

Вы должны делать только расчет при дискриминант равен или больше нуля

if(((Math.pow(b,2)-(4*a*c))>= 0){ /* Calculation here */ } 
else {/*error message or complex number calculus*/}; 
2

Я немного опоздал, но я исправил ваши проблемы (descr в других ответах), зафиксировал один из ваших расчетов и очистил ваш код.

import java.util.*; 

public class Test { 

    public static void main(String[] args) 
    { 
     Scanner s = new Scanner(System.in); 
     System.out.println("Insert value for a: "); 
     double a = Double.parseDouble(s.nextLine()); 
     System.out.println("Insert value for b: "); 
     double b = Double.parseDouble(s.nextLine()); 
     System.out.println("Insert value for c: "); 
     double c = Double.parseDouble(s.nextLine()); 
     s.close(); 

     double answer1 = (-b + Math.sqrt(Math.pow(b, 2) - (4 * a * c)))/(2 * a); 
     double answer2 = (-b - Math.sqrt(Math.pow(b, 2) - (4 * a * c)))/(2 * a); 

     if (Double.isNaN(answer1) || Double.isNaN(answer2)) 
     { 
      System.out.println("Answer contains imaginary numbers"); 
     } else System.out.println("The values are: " + answer1 + ", " + answer2); 
    } 
} 
0

Одна вещь, которую я всегда стараюсь сделать, это положить всю свою математику в соответствующей скобкой, чтобы избежать, слишком легко, порядок операций ошибки. NaN говорит «Не число». Вы также получите это сообщение, если пользователь вводит числа, которые не могут дать результат, например, попытка получить квадратный корень из отрицательного числа. Кроме того, как примечание, вы можете сэкономить когда-нибудь, используя только сканер для a, b и c.

public class QuadraticFormula{ 

    public static void main(String[] args){ 
     java.util.Scanner input = new java.util.Scanner(System.in); 
     double a = input.nextDouble(); 
     double b = input.nextDouble(); 
     double c = input.nextDouble(); 

     double quadPos = (-b + Math.sqrt(Math.pow(b,2)-(4*a*c)))/(2*a); 
     double quadNeg = (-b - Math.sqrt(Math.pow(b,2)-(4*a*c)))/(2*a); 

     System.out.println("-b - = " + quadNeg + "\n-b + = " + quadPos); 

     } 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^