0

わかりましたので、私は完全な Java 初心者であり、スキャナー入力を使用して二次方程式を実行するクラス用のプログラムを作成しようとしています。これまでのところ、私が持っているのはこれです:

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ます...これを修正するにはどうすればよいですか? 私は何を間違っていますか?

4

5 に答える 5

2

回答が少し遅れましたが、問題を修正し (他の回答で説明されています)、計算の 1 つを修正し、コードをクリーンアップしました。

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);
    }
}
于 2013-04-16T21:39:07.637 に答える
2

NaN計算が無効な場合に得られるものです。0 で割ったり、-1 の平方根をとったりします。

でコードをテストするとa = 1、答えはb = 0c = -42.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;
}
于 2013-04-16T21:29:07.073 に答える
1

NaN負の数の平方根を取得しようとしているため、取得しています。複素数を許可しない限り、数学では許可されません1 +/- 2i

これは、判別式 (平方根にあるもの) が負の場合に 2 次式で発生する可能性があります (例x^2 + 6*x + 100: b^2 - 4ac= 36 - 400 = -364)。JavaNaNで負の数の平方根を取ると、になります。(数字ではありません)

をテストするには、 を適切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 が出力されたはずです。

于 2013-04-16T21:29:17.660 に答える
0

判別式がゼロ以上の場合にのみ計算を行う必要があります

if(((Math.pow(b,2)-(4*a*c))>= 0){ /* Calculation here */ } 
else {/*error message or complex number calculus*/};
于 2013-04-16T21:38:27.790 に答える
0

私が常に心がけていることの 1 つは、あまりにも簡単な操作順序の間違いを避けるために、すべての計算を適切な括弧に入れることです。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);

      }
   }
于 2015-11-29T04:02:34.500 に答える