为什么我的代码输出的实数根是一串符号

img

img


为什么我的一元二次方程求根得出来的结果是两串符号哎哟希望得到解答

第16行的条件改为 fabs(d)<1e-8, 因为它是对应判别式等于0的情况;

然后第20行 的条件改为 d>1e-8,因为它是对应判别式大于0的情况,此处不需要fabs求判别式的绝对值,否则会将判别式小于0的情况也在此处求解,而导致计算出现错误。

修改如下:

参考链接:


C++求一元二次方程方程的根(C++的精确度问题)_题目描述 求方程式ax2+bx+c=0的根。c++_Korloa的博客-CSDN博客 利用C++求一元二次方程的根,不能单纯地依靠数学原理,否则会得出错误的结果!先看一道例题:1058:求一元二次方程时间限制: 1000 ms 内存限制: 65536 KB提交数: 102128 通过数: 18399【题目描述】利用公式x1=−b+b2−4ac√2a,x2=−b−b2−4ac,求一元二次方程ax2+bx+c=0的根,其中a不等于0。结果要求精确到小数点后5位。【输入】输入一行,包含三个浮点数a,b,c(它们之间以一个空格分开),分别..._题目描述 求方程式ax2+bx+c=0的根。c++ https://blog.csdn.net/way_back/article/details/122899127



#include <iostream>
#include <cmath>
using namespace std;

int main(void){
    
    double a,b,c,x1,x2,d,rp,ip;
    cout<<"输入系数:"<<endl;
    
    cout<<"a="; cin>>a;
    cout<<"b="; cin>>b;
    cout<<"c="; cin>>c;
    
    // https://blog.csdn.net/weixin_43469047/article/details/83377701
    if(fabs(a)<=1e-8){
        cout<<"它不是一元二次方程"<<endl;
    }else{
        
        d = b*b-4*a*c;
        
        //cout<<"a="<<a<<",b="<<b<<",c="<<c<<",d="<<d<<endl;
        // https://blog.csdn.net/way_back/article/details/122899127
        if(fabs(d)<1e-8){  //delta 等于 0
            cout<<"它有相同两个实数根:"<<-b/(2*a)<<endl;
        }else if(d>1e-8){  // delta 大于 0
            x1=(-b+sqrt(d))/(2*a);
            x2=(-b-sqrt(d))/(2*a);
            cout<<"它有两个实数根"<<x1<<"和"<<x2<<endl;
        }else{   // delta 小于 0
            rp=-b/(2*a);
            ip=sqrt(-d)/(2*a);
            cout<<"它有两个共轭复根"<<endl;
            cout<<rp<<"+"<<ip<<"i"<<endl; 
            cout<<rp<<"-"<<ip<<"i"<<endl; 
        }
        
    }
    
    return 0;
} 

img

下个断点调试一下,变量输入正确没有,计算正确没有,你输出的变量要么是0要么是无穷大

判别式那里应该是
== 1e-8: 相同
> 1e-8: 相异实数根
else: 共轭虚根

【以下回答由 GPT 生成】

解决方案:

首先,问题出现在代码中求解实数根的部分。由于你省略了具体的求根过程的代码,所以我无法判断错误出现在哪里。然而,根据你提供的代码和输出结果,可以看出结果是一串符号的原因是在求根时产生了非数(NaN)的结果。

为了解决这个问题,你需要修改求根的代码,确保计算出正确的实数根。以下是一个可能的修复方案:

#include <iostream>
#include <cmath>
using namespace std;

int main() {
    cout << "请输入方程的系数:\n";

    double a = 10;
    double b = 10;
    double c = 16;

    // 计算判别式
    double discriminant = (b * b) - (4 * a * c);

    // 判断判别式的值来确定方程的实数根个数
    if (discriminant > 0) {
        // 有两个实数根
        double root1 = (-b + sqrt(discriminant)) / (2 * a);
        double root2 = (-b - sqrt(discriminant)) / (2 * a);
        cout << "方程的实数根为:" << root1 << " 和 " << root2 << endl;
    } else if (discriminant == 0) {
        // 只有一个实数根
        double root = -b / (2 * a);
        cout << "方程的实数根为:" << root << endl;
    } else {
        // 没有实数根
        cout << "方程没有实数根" << endl;
    }

    return 0;
}

这段代码通过计算判别式(discriminant)来判断方程的实数根个数。当判别式大于0时,方程有两个实数根,当判别式等于0时,方程只有一个实数根,当判别式小于0时,方程没有实数根。在计算实数根时,我们使用了sqrt函数来计算平方根。

请尝试运行此修复后的代码,并检查输出结果是否正确。如果仍然遇到问题,请提供更多的细节或相关的代码,以便我能够帮助你更好地解决这个问题。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^