如何算一个数的平方根? C++实现

有感

今天学习了MIT的SICP课第一节Lisp语言,教授对平方根的求解、拆解讲的灰常好,一目了然。在这里将程序设计思路、封装思路用C++记录下。


主题

求平方根算法如下:
假设有数字number
1、先用value = 1试试,看看value*value的结果符不符合要求
2、value*value不符合要求的话,再用新的值newValue = (value + number/value)/2试试
3、循环执行步骤2,直到符合要求

符合的要求可以自己定,比如:x*x和number差距小于0.0000001就算符合。


根据以上我们可知主要有两个步骤:

try(x)
{
    if(符合要求)
    {
        return x;
    }
    else
    {
        继续 try((x + number / value) / 2);
        直到符合为止;
    }
}

代码

程序代码自然很快可写出来了:

#include 
using namespace std;

/** 
 * @fn     isGoodEnough
 * @brief  这个值是否足够符合要求了
 * @param  double number 要求平方根的数
 * @param  double x 求出过程中的数
 * @return bool 
 */
bool isGoodEnough(double number, double x)
{
    // 跟要求的数差距小于0.0000001才算足够好 
    if (abs(x * x - number) < 0.0000001)
    {
        return true;
    }
    else
    {
        return false;
    }
}

/** 
 * @fn     runTry
 * @brief  不断尝试的过程
 * @param  double number    要求平方根的数
 * @param  double tryValue  尝试的数
 * @return double   // 足够好后返回的数  也就是求出的值
 */
double runTry(double number, double tryValue)
{
    if (isGoodEnough(number, tryValue))
    {
        return tryValue;
    }
    else
    {
        double newTryValue = (tryValue + number / tryValue) / 2; 
        return runTry(number, newTryValue); // 递归求解
    }
}


/** 
 * @fn     mySqrt
 * @brief  可供外部调用的函数
 * @param  double number [IN] 要求平方根的数
 * @return double
 */
double mySqrt(double number)
{
    double firstTryValue = 1;
    double result = runTry(number, firstTryValue);

    return result;
}


int main(int argc, char* argv[])
{
    double test = mySqrt(36);
    cout << test << endl;
    getchar();
    return 0;
}

注:代码以上函数注重设计思想,不考虑输入负数等异常行为。

你可能感兴趣的:(如何算一个数的平方根? C++实现)