简单程序无法正常工作

时间:2014-10-09 18:02:27

标签: java

import java.util.Scanner;

public class Welcome
{
    public static void main(String[] args)
    {
        Scanner input = new Scanner(System.in);

        double a = input.nextDouble();
        double b = input.nextDouble();
        double c = input.nextDouble();

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

        System.out.println(rezultat);
    }
}

我想知道为什么这段代码不能正常工作。

印刷结果总是:NaN

2 个答案:

答案 0 :(得分:1)

Math.sqrt(Math.pow(b, 2) - 4 * a * c)

这是将返回NaN的部分。如果插入(1,0,1)的值为x ^ 2 + 1,则会得到NaN,因为它永远不会越过x线。

换句话说,如果Math.pow(b,2) - 4 * a * c)< 0,你应该预测NaN。

如果你试图做二次公式,那么正确的公式将是:

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

您需要考虑操作的顺序,在Java中更是如此。您的原始操作将返回不会是x的内容。

此外,+/-二次方有两个预期结果。

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

粗略的程序输出应该是:

    double bsqm4ac = (Math.pow(b, 2) - 4 * a * c);
    if (bsqm4ac < 0.0) {// no intersections of x axis i.e. x^2+2
        System.out.println("No value found");
    } else if (bsqm4ac == 0.0) { //one intersection of x axis i.e. x^2
        System.out.println(-b / (2 * a) + 0.0); // we can get a -0.0 here if
                                                // b = 0, because doubles
    } else { //two intersections of x axis ie. x^2 - 1
        System.out.println((-b - bsqm4ac) / (2 * a) + "," + (-b + bsqm4ac)
                / (2 * a));
    }

答案 1 :(得分:0)

如果参数为负,则

The Math.sqrt method返回NaN(非数字)。一旦你有一个NaN,基本上任何其他操作都只会产生NaN。

请注意,并非所有二次函数都具有真正的根;如果你想要NaN以外的结果,你需要确保 b 2 ≥4 ac

此外:

  • 正如kingdamian42在上面的评论中指出的那样,你需要/ (2 * a)而不是/ 2 * a。 (后者的意思是“除以2,然后乘以 a ”。)
  • 我认为最好写b * b而不是Math.pow(b, 2)。后者较慢,通常具有较大的舍入误差。 (我主要认为Math.pow对非平凡的权力有用。)