Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C+中求解二次方程+; 我试图用C++编写一个函数,用二次方程求解x。这是我最初写的,只要答案中没有复杂的数字,这似乎是可行的: float solution1 = (float)(-1.0 * b) + (sqrt((b * b) - (4 * a * c))); solution1 = solution1 / (2*a); cout << "Solution 1: " << solution1 << endl; float solution2 = (float)(-b) - (sqrt((b*b) - (4 * a * c))); solution2 = solution2 / (2*a); cout << "Solution 2: " << solution2; float solution1=(float)(-1.0*b)+(sqrt((b*b)-(4*a*c)); 溶液1=溶液1/(2*a); 如果你或多或少拥有它,只需检查平方根内的部分是否为负数,然后在你的约化过程中分别跟踪它。_C++_Math_Equation_Quadratic - Fatal编程技术网

在C+中求解二次方程+; 我试图用C++编写一个函数,用二次方程求解x。这是我最初写的,只要答案中没有复杂的数字,这似乎是可行的: float solution1 = (float)(-1.0 * b) + (sqrt((b * b) - (4 * a * c))); solution1 = solution1 / (2*a); cout << "Solution 1: " << solution1 << endl; float solution2 = (float)(-b) - (sqrt((b*b) - (4 * a * c))); solution2 = solution2 / (2*a); cout << "Solution 2: " << solution2; float solution1=(float)(-1.0*b)+(sqrt((b*b)-(4*a*c)); 溶液1=溶液1/(2*a); 如果你或多或少拥有它,只需检查平方根内的部分是否为负数,然后在你的约化过程中分别跟踪它。

在C+中求解二次方程+; 我试图用C++编写一个函数,用二次方程求解x。这是我最初写的,只要答案中没有复杂的数字,这似乎是可行的: float solution1 = (float)(-1.0 * b) + (sqrt((b * b) - (4 * a * c))); solution1 = solution1 / (2*a); cout << "Solution 1: " << solution1 << endl; float solution2 = (float)(-b) - (sqrt((b*b) - (4 * a * c))); solution2 = solution2 / (2*a); cout << "Solution 2: " << solution2; float solution1=(float)(-1.0*b)+(sqrt((b*b)-(4*a*c)); 溶液1=溶液1/(2*a); 如果你或多或少拥有它,只需检查平方根内的部分是否为负数,然后在你的约化过程中分别跟踪它。,c++,math,equation,quadratic,C++,Math,Equation,Quadratic,类似的方法会起作用: struct complex { double r,i; } struct pair<T> { T p1, p2; } pair<complex> GetResults(double a, double b, double c) { pair<complex> result={0}; if(a<0.000001) // ==0 { if(b>0.000001) // !=0 resu

类似的方法会起作用:

struct complex { double r,i; }
struct pair<T> { T p1, p2; }

pair<complex> GetResults(double a, double b, double c)
{
  pair<complex> result={0};

  if(a<0.000001)    // ==0
  {
    if(b>0.000001)  // !=0
      result.p1.r=result.p2.r=-c/b;
    else
      if(c>0.00001) throw exception("no solutions");
    return result;
  }

  double delta=b*b-4*a*c;
  if(delta>=0)
  {
    result.p1.r=(-b-sqrt(delta))/2/a;
    result.p2.r=(-b+sqrt(delta))/2/a;
  }
  else
  {
    result.p1.r=result.p2.r=-b/2/a;
    result.p1.i=sqrt(-delta)/2/a;
    result.p2.i=-sqrt(-delta)/2/a;
  }

  return result;
}
struct complex{double r,i;}
结构对{tp1,p2;}
配对GetResults(双a、双b、双c)
{
配对结果={0};
如果(a0.000001)/!=0
result.p1.r=result.p2.r=-c/b;
其他的
如果(c>0.00001)抛出异常(“无解决方案”);
返回结果;
}
双三角=b*b-4*a*c;
如果(增量>=0)
{
结果:p1.r=-b-sqrt(δ))/2/a;
结果p2.r=-b+sqrt(delta))/2/a;
}
其他的
{
result.p1.r=result.p2.r=-b/2/a;
结果p1.i=sqrt(-delta)/2/a;
结果p2.i=-sqrt(-delta)/2/a;
}
返回结果;
}
这样,对于实结果和复结果,您可以以类似的方式获得结果(实结果只是将虚部设置为0)。用boost看起来会更漂亮


编辑:修复了delta的问题,并添加了一个对退化情况(如a=0)的检查。不眠之夜

基本上,你可以使用
std::complex
而不是
float
来获得对复数的支持。

从Blindy那里继承了这个想法:

typedef std::complex<double> complex;
using std::pair;
pair<complex> GetResults(double a, double b, double c)
{
  double delta=(b*b-4*a*c);
  double inv_2a = 1/2/a;
  if(delta >= 0) {
    double root = sqrt(delta);
    return std::make_pair(
        complex((-b-root)*inv_2a),
        complex((-b+root)*inv_2a);
  } else {
    double root = sqrt(-delta);
    return std::make_pair(
        complex(-b*inv_2a, -root*inv_2a)),
        complex(-b*inv_2a, +root*inv_2a)));
  }
}
typedef std::complex;
使用std::pair;
配对GetResults(双a、双b、双c)
{
双三角=(b*b-4*a*c);
双库存2a=1/2/a;
如果(增量>=0){
双根=sqrt(δ);
return std::make_pair(
复数((-b根)*inv_2a),
复合物((-b+根)*inv_2a);
}否则{
双根=sqrt(-delta);
return std::make_pair(
复数(-b*inv_2a,-根*inv_2a)),
复数(-b*inv_2a,+root*inv_2a));
}
}

所有这些都需要注意。这些回答和原始问题中显示的解决方案并不可靠

众所周知的解决方案(-b+-sqrt(b^2-4ac))/2a在计算中是不稳健的,因为ac比b^2小得多,因为一个是减去两个非常相似的值。对于另一个根,最好使用鲜为人知的溶液2c/(-b-+sqrt(b^2-4ac))

稳健的解决方案可计算为:

temp = -0.5 * (b + sign(b) * sqrt(b*b - 4*a*c);
x1 = temp / a;
x2 = c / temp;
符号(b)的使用确保我们不会减去两个相似的值


对于OP,如其他海报所示,将其修改为复数。

我在没有使用“math.h”标题的情况下尝试了该程序,还尝试了不同的逻辑……但我的程序只能回答那些系数为“x square”的二次方程。。。。。其中,“x”的系数可以表示为两个数的加法,这两个数是常数项的因子。 例如x平方+8x+16; x平方+7x+12; 等等,这里8=4+4&16=4*4;这里x的系数可以表示为两个数的加法,这两个数是常数项16的因子。。。 我自己对此并不完全满意,但尝试了一些不同的方法,没有使用解二次方程的公式。 代码是

#包括
#包括
二次类
{
int b,c;
浮子l,k;
公众:
无效溶液();
};
void二次::解()
{
coutb>>c;

因为(l=1;l其他人提供了很好的答案,所以我没有理由试图超越他们;)但是,如果你想得到方程ax^2+bx+c=0的更一般的解,请记住a==0应该是一个有效值。这将导致零的除法,因此你必须单独处理这种情况。在这种情况下,这意味着你只剩下一个具有一个根的线性方程。干杯!你的意思是你关心复数根,b那么原始方程中的复系数呢?复系数需要另一种完全不同的方法。因此,下一个问题将是:)匆忙离开并准备好答案。如果sqrt成功,结果为>=0。如果参数为负,则程序崩溃。您应该先测试符号,然后计算sqrt之后。如果符号为负数,则设置result.first.i=+sqrt(4*ac bb)/2/a(如果有完美的std::pair,为什么要定义自己的类型?)应该是delta=bb-4*ac,并且只有当delta>=0时才使用sqrt。当我们有一个根时,delta=0或a=0是有效的情况。如果a=b=0和c=1怎么办?如果怎么办?这不是二次函数,/2/a部分将失败。如果delta=0,这相当有效,除了两次返回相同的结果。为什么定义一对和一个复杂类型?两者都是already exist!Portable?Idk..我在24小时不睡觉的情况下在文本编辑器中写下了这一切,我很惊讶它甚至编译了+1,这在计算上比
(-b+/-sqrt(b*b-4*a*c))/(2a)
。顺便说一句:
temp
可能是0.0,所以通常需要预除法检查。(例如a,b,c=1,0,0)。
sign(b)
对于
b>=0,可以定义为+1;对于
b<0,可以定义为-1。
        #include<iostream.h>
        #include<conio.h>
         class quadratic
              {
                int b,c ;
                float l,k;
                public:
               void solution();
              };
        void quadratic::solution()
             {
                 cout<<"Enter coefficient of x and the constant term of the quadratic eqn where coefficient of x square is one";
                 cin>>b>>c;

                 for(l=1;l<b;l++)
                  {
                   for(k=1;k<b;k++)
                    {
                     if(l+k==b&&l*k==c)
                        {
                          cout<<"x="<<-l<<"\t"<<"or"<<"\t"<<"x="<<-k;
                          cout<<"\n";
                         }
                    }
                }
            }
              void main()
                 {
                  quadratic a;
                   clrscr();
                  a.solution();
                  getch();
                 }