【问题标题】:Find root without while and for loop不使用while和for循环查找root
【发布时间】:2016-04-30 13:14:37
【问题描述】:

我正在编写的程序应该找到给定双精度的根。

条件是:不允许使用 while 和 for 循环。不允许任何类型的循环。

我们的教授说禁止使用stdlib函数sqrt()

我开始编写代码,但仍然无法正常工作。希望任何人都可以提供帮助。

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

double mysqrt(double a, double b, double c);

int main(int argc, char** argv) {
    double dBegin{0};
    double dOldroot{0};
    double dNewroot{0};
    double a{0};1

    cin >> dBegin;
    dOldroot = dBegin;
    mysqrt(a, dOldroot, dNewroot);
    cout << dNewroot;
    return 0;
}

double mysqrt(double a, double b, double c) {
    c = (b + (a / b)) / 2.0;
    if (a != 8) {
        c = mysqrt(a++, b, c);
    }
    return c;
}

【问题讨论】:

标签: c++ algorithm math


【解决方案1】:

我正在使用 Newton-Raphson 方法 来找出给定数字 num 的平方根(在我的代码中)

您可能会发现此视频链接很有用:Click Here。使用这个算法我已经解决了这个问题。

这是我的代码。

#include <iostream>
using namespace std;

/* we are gonna use Newton-Raphson's method to find its square because 
   it converges quickly, even calculators use this algo. to find the sqr-root */

double find_sqrt(double x, int num, int count) {
    if(count == 0) 
        return x;

    double f_x  = x*x - num;
    double f_dx = 2*x;
    double res = x - (f_x/f_dx);

    x = find_sqrt(res, num, count -1);
    return x;

}

int main() {
    double num;
    cin >> num;

    /* Here 20 is the maximum number of times it will run and 
    num/2 is the random number send to the function between the range 1 to num */
    cout << find_sqrt(num/2, num, 20);  

    return 0;
}

结果可能不太精确,但总是几乎接近数字的实际平方根。
原因:浮点精度错误。我相信你一定知道这一点。

【讨论】:

  • 请注意。如果num = 0,此代码将失败。所以请注意
【解决方案2】:
  • 你有垃圾1double a{0}; 之后导致编译错误
  • 您的代码将执行无限递归,因为第一个参数不会更新。使用double 作为计数器也不是一个好主意。
  • 您将在main() 中丢弃从mysqrt 返回的值。
  • 将参数用作局部变量而不读取其值不是一个好主意。

修复这些错误,您的代码将如下所示:

#include <cstdlib>
#include <iostream>

using namespace std;

double mysqrt(int a, double b);

int main(int argc, char** argv) {

    double dBegin{0};
    double dOldroot{0};
    double dNewroot{0};
    int a{0};

    cin >> dBegin;
    dOldroot = dBegin;

    dNewroot = mysqrt(a, dOldroot);

    cout << dNewroot;

    return 0;
}

double mysqrt(int a, double b) {
    double c = (b + (a / b)) / 2.0;
    if (a != 8) {
        c = mysqrt(a + 1, b);
    }
    return c;
}

此代码计算平方根失败,但运行时很快编译退出。

【讨论】:

  • 感谢您的回答。我应该改变什么才能得到正确的平方根?
猜你喜欢
  • 1970-01-01
  • 2021-05-06
  • 1970-01-01
  • 2020-03-30
  • 2014-02-01
  • 1970-01-01
  • 2014-10-15
  • 2021-12-30
  • 1970-01-01
相关资源
最近更新 更多