Java 二次公式
我试图找到这个程序的二次公式,我不确定我犯了什么错误,但它似乎对我不起作用。输入5、-8、3、3、2、-7的输出为NaN。请记住,我有另一个类来测试这些方法,如果需要,我可以发布 编辑代码:Java 二次公式,java,Java,我试图找到这个程序的二次公式,我不确定我犯了什么错误,但它似乎对我不起作用。输入5、-8、3、3、2、-7的输出为NaN。请记住,我有另一个类来测试这些方法,如果需要,我可以发布 编辑代码: import java.util.Scanner; import static java.lang.System.*; import static java.lang.Math.*; public class Quadratic { private int a, b, c; privat
import java.util.Scanner;
import static java.lang.System.*;
import static java.lang.Math.*;
public class Quadratic
{
private int a, b, c;
private double rootOne;
private double rootTwo;
public Quadratic()
{
}
public Quadratic(int quadA, int quadB, int quadC)
{
a = quadA;
b = quadB;
c = quadC;
}
public void setEquation(int quadA, int quadB, int quadC)
{
a = quadA;
b = quadB;
c = quadC;
}
public void calcRoots( )
{
rootOne = (-b + Math.sqrt(Math.pow(b,2)-4*a*c))/(2*a);
rootTwo = (-b - Math.sqrt(Math.pow(b,2)-4*a*c))/(2*a);
}
public void print( )
{
System.out.println("");
System.out.print("ROOTS :: "+ rootOne);
System.out.println("\t" + rootTwo);
System.out.println("");
System.out.println("");
}
}
测试等级:
import java.util.Scanner;
import static java.lang.System.*;
import static java.lang.Math.*;
public class QuadraticRunner
{
public static void main( String[] args )
{
Scanner keyboard = new Scanner(in);
System.out.print("ENTER A :: ");
int a = keyboard.nextInt();
System.out.print("ENTER B :: ");
int b = keyboard.nextInt();
System.out.print("ENTER C :: ");
int c = keyboard.nextInt();
Quadratic test = new Quadratic();
test.calcRoots();
test.print();
System.out.print("ENTER A :: ");
a = keyboard.nextInt();
System.out.print("ENTER B :: ");
b = keyboard.nextInt();
System.out.print("ENTER C :: ");
c = keyboard.nextInt();
test.calcRoots();
test.print();
System.out.print("ENTER A :: ");
a = keyboard.nextInt();
System.out.print("ENTER B :: ");
b = keyboard.nextInt();
System.out.print("ENTER C :: ");
c = keyboard.nextInt();
test.calcRoots();
test.print();
}
}
你缺少括号了
rootOne = (-b + Math.sqrt(b * b - 4 * a * c)) / (2 * a);
此外,您没有处理任何特殊情况,如虚根、重复根等。我不会使用setEquation方法和实例变量。我想那会给你带来不必要的麻烦
您可以这样做,而不必存储实例变量:
public double [] calcRoots(int a, int b, int c)
{
double[] roots = new double[2];
roots[0] = (-b + Math.sqrt(b * b - 4 * a * c)) / (2 * a);
roots[1] = (-b - Math.sqrt(b * b - 4 * a * c)) / (2 * a);
return roots;
}
在你的测试中,你从来没有设置a,b和c。使用无参数二次构造函数:
Quadratic test = new Quadratic();
而且你不需要调用setEquation
a、b和c的默认值为0,这就是为什么您得到的是NaN而不是数字值:
( -0 + Math.sqrt( Math.pow( 0 , 2 ) - 4 * 0 * 0 ) ) / ( 2 * 0 )
==
( 0.0 ) / ( 0.0 ) // IEEE division of zero by zero results in NaN
使用int、int、int构造函数或setEquation
请向我们展示如何初始化和使用此类的方法。另外:float getVertexX{return-b/2f*a;};:我是为一个comp-sci课程做这件事的,我想他们只是想要最简单的二次公式。我还添加了你建议的编辑,但是仍然有NaN,也许b是负数?谢谢你的帮助@Certus我说你没有处理特殊情况。当a=0时,二次公式失败。二次型退化为bx+c=0,所以你求解x,x=-c/b。这是线性情况。千万不要在不理解数学的情况下编写软件。@Mr.polywhill当浮点除法的分母为零时,Java也会返回NaN或无穷大。看。一定要检查这些东西。你忘了:float x2=b*b-4*a*c,布尔值isReal=x2>=0,float sqrt=Math.sqrtisReal?x2:x2*-1,float root1=-b+sqrt/2*a,root2=-b-sqrt/2*a@Mr.Polywhirl接得好,我没想到。谢谢你的帮助,但就像我提到的@Gene,这是一门初级的Comp-Sci课程,所以我还没有学过,所以我的老师会知道这不是我的工作,我也还没学到那么远。D:有没有什么方法可以像我在代码中所展示的那样使用这个方法?@Certus我不知道该怎么说。我觉得有点悲哀;就像你在阻止自己学习一样。PS,它只是一个数组。我只是不想在我的代码中加入一些我不理解的东西。只要我能解释我做了什么,我相信如果我把它放进去就好了。我确实有一个问题:是什么错误导致我使用不同的代码?顺便说一下,谢谢你的链接。我将确保查看并了解更多信息:仅供参考:在IEEE标准中,仅当您除以0/0时,NaN中的除零结果;任何其他/0都将导致正或负无穷大。@ajb是的,您是正确的。他们得到的是0.0/0.0。@ajb NaN/0也是NaN。
Quadratic test = new Quadratic(a, b, c);
test.setEquation(a, b, c);