无限循环计算立方根

时间:2013-09-03 11:35:46

标签: c++ newtons-method

我正在尝试创建一个通过牛顿方法计算立方根的函数,但由于某种原因,我似乎在这里有一个无限循环?

#include <iostream>
#include <math.h>

using namespace std;

double CubicRoot(double x, double e);

int main()
{
    cout << CubicRoot(5,0.00001);
}

double CubicRoot(double x, double e)
{
    double y = x;
    double Ynew;
    do 
    {
        Ynew = y-((y*y)-(x/y))/((2*y)+(x/(y*y)));
        cout << Ynew;

    } while (abs(Ynew-y)/y>=e);

    return Ynew;
}

2 个答案:

答案 0 :(得分:8)

迭代时,您尚未更新y变量。 使用abs非常危险,因为它可能在某些编译器上舍入为整数。

修改

澄清我的意思:将abs<math.h>一起使用会导致不同编译的隐式类型转换问题(请参阅下面的评论)。真正的c ++风格将使用评论中建议的<cmath>标题(感谢您的回复)。

您的代码的最小更改将是:

double CubicRoot(double x, double e)
{
    double y = x;
    double Ynew = x;
    do 
    {
        y = Ynew;
        Ynew = y-((y*y)-(x/y))/((2*y)+(x/(y*y)));
        cout << Ynew;

    } while (fabs(Ynew-y)/y>=e);
    return Ynew;
}

答案 1 :(得分:0)

您可以更改

    Ynew = y-((y*y)-(x/y))/((2*y)+(x/(y*y)));

等同但更易识别的表达

    Ynew = y*(y*y*y+2*x)/(2*y*y*y+x)

这是f(y)= y ^ 3-x的Halley方法,并且具有三阶收敛。