C++ 编写手动平方根函数?

C++ 编写手动平方根函数?,c++,math,inclusion,C++,Math,Inclusion,对于我的类,我正在使用包含编写一个平方根函数。不,我可能不会使用任何其他方法 这是我到目前为止的代码,程序几乎可以运行。它适用于完美平方根和一些其他值(如11或5),但对于其他值(8,2),它会进入一个无限循环 发生这种情况的原因是上下限(b和a)没有改变。理想情况下,边界将是当前x和上一个x,从而创建新的x。所发生的是,新的x当前由电流x和a或b构成,它们是一个常数 我已经尝试了很长时间,但我还没有找到一种方法来“记住”或找到“以前的x”,因为每次while循环重复,只有当前的x可用。有人知道

对于我的类,我正在使用包含编写一个平方根函数。不,我可能不会使用任何其他方法

这是我到目前为止的代码,程序几乎可以运行。它适用于完美平方根和一些其他值(如11或5),但对于其他值(8,2),它会进入一个无限循环

发生这种情况的原因是上下限(b和a)没有改变。理想情况下,边界将是当前x和上一个x,从而创建新的x。所发生的是,新的x当前由电流x和a或b构成,它们是一个常数

我已经尝试了很长时间,但我还没有找到一种方法来“记住”或找到“以前的x”,因为每次while循环重复,只有当前的x可用。有人知道如何解决这样的问题吗

void inclusion ()
{
    double v ;
    cout << "*** Now solving using Inclusion ***" << endl << "To calculate the square root, enter a positive number: " ;
    cin >> v ;

    while (v<0)
    {
        cout << "Square roots of negative numbers cannot be calculated, please enter a positive number: " ;
        cin >> v ;
    }

    cout << endl ;

    int n = 0;
    while (v >= n*n)
        n++ ;

    double b = n ;
    double a = n-1 ;

    int t = 0 ;
    double x = (a+b)/2 ;

        while ((x * x - v >= 0.1) || (x * x - v <= -0.1))
        {
            t++ ;

            if (x * x < v)
                {
                cout << "Lower Bound: " << x << '\t' << '\t' ;
                cout << "Upper Bound: " << b << '\t' << '\t' ;
                x = (b + x)/2 ;
                cout << "Approximation " << t << ": " << x  << endl ;
                }

            else
                {
                cout << "Lower Bound: " << a << '\t' << '\t' ;
                cout << "Upper Bound: " << x << '\t' << '\t' ;
                x = (a + x)/2 ;
                cout << "Approximation " << t << ": " << x  << endl ;
                }
        }

    cout << endl << "The answer is " << x << ". Iterated " << t << " times." << endl << endl ;
}
void inclusion()
{
双v;
cout=0.1)| |(x*x-v
我还没有找到“记住”或“以前的x”的方法

在循环的末尾有一个变量
previous_x
,您可以
previous_x=x

但这不是你的问题。你正在改变
x
,但不是
a
b
,因此你进入了一个无限重复的模式。相反,你应该调整哪个界限让你更紧

void inclusion ()
{
    double v ;
    cout << "*** Now solving using Inclusion ***" << endl << "To calculate the square root, enter a positive number: " ;
    cin >> v ;

    while (v<0)
    {
        cout << "Square roots of negative numbers cannot be calculated, please enter a positive number: " ;
        cin >> v ;
    }

    cout << endl ;

    int n = 0;
    while (v >= n*n)
        n++ ;

    double b = n ;
    double a = n-1 ;

    int t = 0 ;

    double x;
    for (x = (a+b)/2; abs(x * x - v) >= 0.1; x = (a+b)/2, ++t)
    {
        if (x * x < v)
        {
            cout << "Lower Bound: " << x << '\t' << '\t' ;
            cout << "Upper Bound: " << b << '\t' << '\t' ;
            a = (b + x)/2 ;
            cout << "Approximation " << t << ": " << x  << endl ;
        }   
        else
        {
            cout << "Lower Bound: " << a << '\t' << '\t' ;
            cout << "Upper Bound: " << x << '\t' << '\t' ;
            b = (a + x)/2 ;
            cout << "Approximation " << t << ": " << x  << endl ;
        }
    }

    cout << endl << "The answer is " << x << ". Iterated " << t << " times." << endl << endl ;
}
void inclusion()
{
双v;
cout=0.1;x=(a+b)/2,+t)
{
if(x*x
在循环的末尾有一个变量
previous_x
,您可以
previous_x=x

但这不是你的问题。你正在改变
x
,但不是
a
b
,因此你进入了一个无限重复的模式。相反,你应该调整哪个界限让你更紧

void inclusion ()
{
    double v ;
    cout << "*** Now solving using Inclusion ***" << endl << "To calculate the square root, enter a positive number: " ;
    cin >> v ;

    while (v<0)
    {
        cout << "Square roots of negative numbers cannot be calculated, please enter a positive number: " ;
        cin >> v ;
    }

    cout << endl ;

    int n = 0;
    while (v >= n*n)
        n++ ;

    double b = n ;
    double a = n-1 ;

    int t = 0 ;

    double x;
    for (x = (a+b)/2; abs(x * x - v) >= 0.1; x = (a+b)/2, ++t)
    {
        if (x * x < v)
        {
            cout << "Lower Bound: " << x << '\t' << '\t' ;
            cout << "Upper Bound: " << b << '\t' << '\t' ;
            a = (b + x)/2 ;
            cout << "Approximation " << t << ": " << x  << endl ;
        }   
        else
        {
            cout << "Lower Bound: " << a << '\t' << '\t' ;
            cout << "Upper Bound: " << x << '\t' << '\t' ;
            b = (a + x)/2 ;
            cout << "Approximation " << t << ": " << x  << endl ;
        }
    }

    cout << endl << "The answer is " << x << ". Iterated " << t << " times." << endl << endl ;
}
void inclusion()
{
双v;
cout=0.1;x=(a+b)/2,+t)
{
if(x*xcout您还需要更新边界:

a = x;
x = (b + x)/2;


您还需要更新边界:

a = x;
x = (b + x)/2;


没有什么能阻止您在计算新的
x
之前保存变量
previous_x
。您需要在每次迭代时计算新的边界a和b,而不仅仅是新的x。没有任何东西可以阻止您在计算新的
x
之前保存变量
previous_x
。您需要在每次迭代时计算新的边界a和b,而不仅仅是新的x,我试过了,也许我没有像你说的那样正确地输入,但它不起作用…我试过了,也许我没有像你说的那样正确地输入,但它不起作用…我知道发生了什么。我确实试过了,当我没有把a和b改成双精度的时候。它们是整数,它不起作用,但是现在成功了。谢谢!你救了一条命!我必须在5分钟内交上来:pI看看发生了什么。我在没有把a和b改成双精度的情况下就这么做了。当它们是整数时,它不起作用,但现在它起作用了。谢谢!你救了一条命!我必须在5分钟内交上来:p