sqrt函数的实现

sqrt函数用来求平方根的函数,本篇文章介绍普通的二分法求解和sqrt实现的牛顿迭代法求解这两种方法;

二分法

  1. 确定待求解的区间,假设待求解的值x所在的区间为[a,b]。
  2. 计算中间点c = (a + b) / 2,判断f©是否等于0,若等于0,则c就是方程的解;否则判断f©的符号。
  3. 如果f© > 0,说明待求解的值x在区间(a,c)内,将区间缩小为[a,c];如果f© <0,说明待求解的值x在区间(c,b)内,将区间缩小为[c,b]。
  4. 重复执行步骤2和步骤3,直到找到满足精度要求的近似解或达到最大迭代次数为止。
#include <iostream>
#include <cstdlib>

double mySqrt(double x) {
    double left = 0, right = x; // 初始区间为[0,x]
    double eps = 1e-10; // 精度要求为10位小数
    while (right - left > eps) { // 精度要求为10位小数
        double mid = (left + right) / 2; // 取中间点
        if (mid * mid > x) { // 如果mid的平方大于x,说明待求解的值在左半边
            right = mid; // 缩小区间为[left,mid]
        } else { // 否则说明待求解的值在右半边
            left = mid; // 缩小区间为[mid,right]
        }
    }
    return (left + right) / 2; // 返回近似解
}

int main() {
    double x;
    std::cout << "请输入一个正数:";
    std::cin >> x;
    printf("该数的平方根为:%.10lf\n", mySqrt(x));
    return 0;
}

牛顿迭代法

牛顿迭代法是一种求解方程根的方法,其基本思想是通过迭代公式不断逼近方程的根。对于求解平方根的问题,我们可以将其转化为求解x^2 - a = 0的根,其中a为给定的数。迭代公式为:x{n+1} = (x+ a / x) / 2。

#include <iostream>
#include <cmath>

double sqrt_newton(double x) {
    double guess = x; // 猜测x的平方根答案 
    double precision = 1e-10; // 设定精度为10位
    double diff = std::abs(guess * guess - x); // 记录迭代过程中的差值

    while (diff > precision) {
        guess = (guess + x / guess) / 2; // 迭代公式
        diff = std::abs(guess * guess - x); // 计算误差
    }

    return guess;
}

int main() {
    double x;
    std::cout << "请输入一个数:";
    std::cin >> x;

    double result = sqrt_newton(x);
    printf("%.10lf\n", result);
    double result2 = sqrt(2);
	printf("%.10lf\n", result2);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值