📜  在 C++ 中查找数字的平方根(1)

📅  最后修改于: 2023-12-03 15:37:18.629000             🧑  作者: Mango

在 C++ 中查找数字的平方根

计算平方根是数学中基本的操作之一,但在编程中,如何计算数字的平方根呢?本文介绍在 C++ 中查找数字的平方根的方法。

1. sqrt() 函数

C++ 标准库提供了一个 sqrt() 函数,可以计算浮点数的平方根。它在头文件 <cmath> 中定义。使用方式如下:

#include <cmath>
#include <iostream>

int main()
{
    double x = 25.0;
    double sqrt_x = sqrt(x);
    std::cout << "x的平方根是:" << sqrt_x << std::endl;
    return 0;
}

输出:

x的平方根是:5

需要注意的是,sqrt() 函数只能计算浮点数的平方根,如果要计算整数的平方根,需要进行类型转换。例如:

int x = 25;
int sqrt_x = sqrt(static_cast<double>(x));
std::cout << "x的平方根是:" << sqrt_x << std::endl;

输出结果仍然是:

x的平方根是:5
2. 牛顿迭代法

牛顿迭代法是一种逐步逼近平方根的方法。它的思路是对于一个给定的数a,任意选择一个起始点x0,然后用下面的公式逐步逼近a的平方根:

C++ 实现代码如下:

double sqrt_newton(double a, double x0, double precision)
{
    double x = x0;
    while (std::abs(x * x - a) > precision)
    {
        x = 0.5 * (x + a / x);
    }
    return x;
}

其中 a 是需要求平方根的数,x0 是起始点,precision 是精度,即逼近的误差限制,函数返回逼近的平方根。

此时,计算 25 的平方根,调用方法如下:

std::cout << "25的平方根是:" << sqrt_newton(25, 1.0, 1e-6) << std::endl;

输出结果为:

25的平方根是:5
3. 二分法

二分法是一种寻找一个区间内根的方法。对于一个单峰函数f(x),设它在区间[a, b]上有一个唯一的零点c,则二分法的基本思想是从区间中点d=(a+b)/2出发,如果f(d)>0,则零点在区间[a, d]中;否则,零点在区间[d, b]中。由此可以得到如下的二分搜索代码:

double sqrt_binary_search(double a, double precision)
{
    if (a < 0)
    {
        return -1.0; // 负数无法计算平方根
    }

    double left = 0.0, right = a;
    double mid = (left + right) / 2;

    while (std::abs(mid * mid - a) > precision) {
        if (mid * mid > a) {
            right = mid;
        } else {
            left = mid;
        }
        mid = (left + right) / 2;
    }

    return mid;
}

调用方法与牛顿迭代法类似:

std::cout << "25的平方根是:" << sqrt_binary_search(25, 1e-6) << std::endl;

输出结果为:

25的平方根是:5
4. 总结

本文介绍了在 C++ 中查找数字的平方根的三种方法:sqrt() 函数、牛顿迭代法、二分法。其中,sqrt() 函数是标准库提供的计算浮点数平方根的方法,而牛顿迭代法和二分法则是一种逐步逼近的方法,能够高效地计算任意精度的浮点数平方根。