sqrt函数用来求平方根的函数,本篇文章介绍普通的二分法求解和sqrt实现的牛顿迭代法求解这两种方法;
二分法
- 确定待求解的区间,假设待求解的值x所在的区间为[a,b]。
- 计算中间点c = (a + b) / 2,判断f©是否等于0,若等于0,则c就是方程的解;否则判断f©的符号。
- 如果f© > 0,说明待求解的值x在区间(a,c)内,将区间缩小为[a,c];如果f© <0,说明待求解的值x在区间(c,b)内,将区间缩小为[c,b]。
- 重复执行步骤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;
}