【问题标题】:Finding a square root through iteration in c++在c ++中通过迭代找到平方根
【发布时间】:2012-09-19 00:27:00
【问题描述】:

我有一个家庭作业要交,我的循环有问题。我首先必须通过我已经可以做的循环找到下一个最高和最低的平方根。接下来我的作业告诉我,我需要通过平均整数的下一个最高和最低平方根来获得平方根的近似值。然后我必须询问用户他们想要的小数位数。这是作业的引述:

然后应该构造一个计数控制的循环;它将为每个所需的小数位执行一次;在示例中,此循环将执行四次(十位、百位、千位和千位小数位各执行一次)。使用诸如decimalPosition 之类的计数器来跟踪循环处于哪个阶段。

这是我遇到问题的地方,我正在使用基于用户输入的小数位数的 while 循环,但我的循环没有完成循环。我是编程新手,所以如果这真的很简单,请原谅我。这是我的while代码:

for (int decimalPosition = 1; decimalPosition <= decimal; decimalPosition++)
{
    while (baseRoot*baseRoot > num)
    {
        baseRoot = baseRoot - (pow((.1),decimalPosition));
        cout << fixed << setprecision(decimal) << baseRoot << endl;
    }

}

这是我目前的输出

Enter a number you wish to know the square root of: 8
Enter the number of decimal places of accuracy you want: 7
Find the square root of 8 to 7 decimal places: 
2.6000000
2.7000000
2.8000000
2.9000000
2.9000000 square root of 8.0000000

【问题讨论】:

  • 你能删除作业标签吗 - 它已被弃用
  • @AdrianCornish 认为它现在不见了,反正我现在看不到了 :)
  • 当然,你意识到你所拥有的“到目前为止”是完全不正确的。这不是小数点后 8 到 7 位的平方根。
  • 我确实意识到了这一点,这就是我之前提出这个问题的原因,但后来我发现我的问题是计数控制循环出现故障。感谢所有试图帮助我的人!

标签: c++ algorithm math square-root


【解决方案1】:

它叫做Newton's method,它的收敛性是二次的。这应该可以帮助您弄清楚。

PS - 巴比伦人首先发现了它,但牛顿得到了赞誉。

【讨论】:

  • 别让我开始谈论巴比伦人。
  • 我算对了。我发现我错误地实现了我的循环。我的计数控制循环未正确初始化。现在我的代码通过这种方法神奇地找到了平方根。很漂亮!!
【解决方案2】:

为了让你的循环正常工作,你可以添加一个语句

baseRoot = baseRoot + (pow((.1),decimalPosition));

在 while 循环之后,因为您需要确保 baseRoot 大于每次迭代之前的答案。像这样:

for (int decimalPosition = 1; decimalPosition <= decimal; decimalPosition++)
{
    while (baseRoot*baseRoot > num)
    {
        baseRoot = baseRoot - (pow((.1),decimalPosition));
        cout << fixed << setprecision(decimal) << baseRoot << endl;
    }
    baseRoot = baseRoot + (pow((.1),decimalPosition));
}

现在你可以得到答案2.8284271

顺便说一下,还有另一种有效的方法,叫做二分法(类似于二分查找)来解决这类问题(与单调函数有关),无需过多的数学运算:

double mySqrt(double x, double epsilon) {
    double left = 0, right = x;
    while (right - left > epsilon) {
        double mid = (left + right) / 2;
        if (mid * mid > x) {
            right = mid;
        } else {
            left = mid;
        }
    }
    return left;
}

这很简单,愚蠢:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-20
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2021-09-14
    • 1970-01-01
    相关资源
    最近更新 更多