没有数学库的二次方程

时间:2018-03-12 01:48:14

标签: c++

我有一个问题,主要函数是switch语句的case 8,它应该使用Quadratic公式求解方程。

case 8: {
        float h, numero;
        float s = 0.00001, x = s;
        float c, q;
        cout<<"Introduce los valores: " <<endl;
        cout<<"a = "; cin>>a; cout<<endl;
        cout<<"b = "; cin>>b; cout<<endl;
        cout<<"c = "; cin>>c; cout<<endl;

        for(int e=0; e < 15; e++){
        cout<<".";
        Sleep(60);
    }

        cout<<"x = (-b +/- sqrtb^2 - 4ac)/2a "<<endl;

        q = (b*b - 4*a*c);
        if (q > 0){

            for (h=1; h <= q; h++){


                while (x*x < h){
                x += s; 
                }


            }
            cout<<"Las raices de tu ecuacion de segundo grado son: " <<endl <<(-b + q)/2*a <<endl <<" y " <<endl <<(-b - q)/2*a;
        }



        else {
            cout<<"tus raices son imaginarias :( "<<endl;
        }
    }break;

1 个答案:

答案 0 :(得分:0)

我不确定您的确切问题是什么,如果您添加一些说明,我会对此进行编辑,但这里有一些信息和观察结果可以帮助您。

平方根函数通常实现为 迭代函数 ,这意味着它从某个基本猜测开始,然后不断改进每个循环的猜测。当其近似值达到某个容差范围内的误差时,它将退出并返回其近似值。

您的代码正在尝试执行此操作,但您的迭代中存在严重错误。结果是,与C ++数学库的标准平方根实现相比,您的答案非常不准确。

    if (q > 0){
        for (h=1; h <= q; h++){
            while (x*x < h){
            x += s; 
            }
        }
    }

你有一个while循环包含在一个for循环中,它添加一个然后迭代直到h大于q。问题是q可以代表2.56之类的内容,而h只代表值1.02.03.0等。这会增加一些额外的和不必要的错误,因为h实际上不能代表q的真值,因此循环必须使用近似2.0代替2.56来生成。

如果将其更改为:

,您可以获得非常接近C ++的sqrt函数的准确度
if (q > 0){
    while (x*x < q){
        x += s; 
    }
}

请注意,我已移除for循环并将while (x*x < h)更改为while (x*x < q)

我希望这会有所帮助。如果这不是您想要的,请发布更多详细信息!