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
答案 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 。
此外:
/ (2 * a)
而不是/ 2 * a
。 (后者的意思是“除以2,然后乘以 a ”。)b * b
而不是Math.pow(b, 2)
。后者较慢,通常具有较大的舍入误差。 (我主要认为Math.pow
对非平凡的权力有用。)