平方根的三种求法(袖珍计算器算法,二分查找,牛顿迭代)

一、袖珍计算器

袖珍计算器方法主要运用到了我们高数上所学的关于e底数转化的思想,即

一种用指数函数 exp⁡ 和对数函数 ln⁡ 代替平方根函数的方法 :

1、exp函数:

exp是 C 标准库 <math.h> 中的一个函数,用于计算 e 的 x 次幂,其中 e 是自然对数的底数(约为 2.71828)。

函数声明:

#include <math.h>double exp(double x);
float expf(float x);
long double expl(long double x);

函数用法:

#include <stdio.h>
#include <math.h>int main ()
{double x = 0;printf("e 的 %lf 次幂是 %lf\n", x, exp(x));printf("e 的 %lf 次幂是 %lf\n", x+1, exp(x+1));printf("e 的 %lf 次幂是 %lf\n", x+2, exp(x+2));return(0);
}

 2、log函数:

log是 C 标准库 <math.h> 中的一个函数,用于计算一个浮点数的自然对数(以 e 为底)。

函数声明:

#include <math.h>double log(double x);
float logf(float x);
long double logl(long double x);

函数返回值:

  • 如果 x 为负数,log() 函数将返回 NaN,并设置 errno 为 EDOM
  • 如果 x 为零,log() 函数将返回 -HUGE_VAL(负无穷大),并设置 errno 为 ERANGE

C 库宏 extern int errno 是通过系统调用设置的,在错误事件中的某些库函数表明了什么发生了错误。

errno 是 C 标准库中的一个宏,定义在 <errno.h> 头文件中。它用于指示在程序运行过程中发生的错误。errno 实际上是一个整数变量,用于存储错误代码。库函数在发生错误时,会设置 errno 为适当的错误代码,以便程序可以检查和处理这些错误。

函数用法:

#include <stdio.h>
#include <math.h>int main ()
{double x, ret;x = 2.7;/* 计算 log(2.7) */ret = log(x);printf("log(%lf) = %lf", x, ret);return(0);
}

3、实现

所以我们可以写出如下的函数:

int mySqrt(int x) {if (x == 0) {return 0;}int ans = exp(0.5 * log(x));return ans;}

但是在leetcode上提交会有一项通不过:

由于计算机无法存储浮点数的精确值,而指数函数和对数函数的参数和返回值均为浮点数,因此运算过程中会存在误差。例如当 x=2147395600的计算结果与正确值 463404634046340 相差 10^-11 ,这样在对结果取整数部分时,会得到 463394633946339 这个错误的结果。因此在得到结果的整数部分后,我们应当再将(ans+1)^2的值再与x经行比较如果比x小则说明出现了刚刚那种情况。

二、二分查找

这种思想主要是来源于对于x的平方根ans(平方根的整数部分)来说:ans^2一定是<=x的,

(ans+1)^2>x

所以一种简单的思想是将从0到x的所有值与x按照上面的思路比较

int mySqrt(int x) {unsigned long long len=0;unsigned long long ret=0;while(len<=x){if(len*len<=x&&(len+1)*(len+1)>x){ret=len;break;}len++;}return ret;}

但是实际上我们比较的时候是相当于对有序数组经行查找操作,所以我们可以用二分查找的想法去改进这个题:

int mySqrt(int x) 
{int l = 0, r = x, ans = -1;while (l <= r) {long long  mid = l + (r - l) / 2;if (mid * mid <= x) {ans = mid;l = mid + 1;}else {r = mid - 1;}}return ans;}

 三、牛顿迭代

1、原理

牛顿迭代法是一种可以用来快速求解函数零点的方法。(链接:牛顿迭代法_百度百科 (baidu.com))我们可以设出如下函数:

 显然:c的平方根计算f(x)的零点(零点是x的值,这里我们取正的);

牛顿迭代法的本质是借助泰勒级数,从初始值开始快速向零点逼近。我们任取一个xo作为初始值,在每一步的迭代中,我们找到函数图像上的点(xi,f(xi)),过该点作一条斜率为该点导数f'(xi)的直线,与横轴的交点记为xi+1。xi+1相较于xi而言距离零点更近。在经过多次迭代后,我们就可以得到一个距离零点非常接近的交点。

按照我的理解就是利用函数切点斜率等于函数值变化率的 本质使得f(xo)的值快速往下降最终降到为0时即为零点。

2、算法

我们选择xo=C作为初始值。
在每一步迭代中,我们通过当前的交点xi,找到函数图像上的点(xi,x²-C),作一条斜率为f'(xi)=2x;的直线,直线的方程为:
                                                y=2xi*(x-xi)+xi²-C
                                                  =2xi*x-(x²+C)

横轴的交点为方程2xi*x-(xi²+C)=0的解,即为新的迭代结果xi+1=1/2*(xi+c/xi)
在进行k次迭代后,xk的值与真实的零点√C足够接近,即可作为答案。

什么时候结束呢?

一般来说,可以判断相邻两次迭代的结果的差值是否小于一个极小的非负数 ϵ,其中 ϵ 一般可以取 10^−6或 10^-7(再leetcode上这个数据段可以用1e-7来实现也可以看这篇博客:(C中float类型与0比较用e-7的原因_fabs(disc) <= 1e-7-CSDN博客)

3、实现:

class Solution {
public:int mySqrt(int x) {if (x == 0) {return 0;}double C = x, x0 = x;while (true) {double xi = 0.5 * (x0 + C / x0);if (fabs(x0 - xi) < 1e-7) {break;}x0 = xi;}return int(x0);}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/859870.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微服务(服务治理)

服务远程调用时存在的问题 注册中心原理 服务治理中的三个角色分别是什么&#xff1f; 服务提供者&#xff1a;暴露服务接口&#xff0c;供其它服务调用服务消费者&#xff1a;调用其它服务提供的接口注册中心&#xff1a;记录并监控微服务各实例状态&#xff0c;推送服务变更信…

【乐吾乐2D可视化组态编辑器】图表动态显示

1. 添加数据 乐吾乐2D可视化组态编辑器地址&#xff1a;https://2d.le5le.com/ 图表动态展示是指一个图表图元的数据属性&#xff08;一般是dataY&#xff09;绑定多个变量&#xff0c;建立通信后数据动态变化展示。 官网默认Echarts图表拖拽到画布中是已经添加了图元的da…

【ChatBI】超轻量Python库Vanna快速上手,对接oneapi

oneapi 准备 首先确保你有oneapi &#xff0c;然后申请 kimi的api 需要去Moonshot AI - 开放平台 然后添加一个api key 然后打开oneapi的渠道界面&#xff0c;添加kimi。 然后点击 测试&#xff0c; 如果能生成响应时间&#xff0c;就是配置正确。 然后创建令牌 http:…

Ant Design Vue中的Table和Tag的基础应用

目录 一、Table表格 1.1、显示表格 1.2、列内容过长省略展示 1.3、完整分页 1.4、表头列颜色设置 二、Tag标签 2.1、根据条件显示不同颜色 2.2、控制关闭事件 一、Table表格 效果展示&#xff1a; 官网&#xff1a;Ant Design Vue 1.1、显示表格 <a-tableref&quo…

k8s集群搭建及对一些组件的简单理解

背景 k8s的学习环境&#xff08;用kubeadm方式搭建&#xff09;&#xff0c;我也搭过几次了&#xff0c;但都有点问题。 要么在云服务器上弄&#xff0c;这个的问题是就只有一台轻量服务器&#xff0c;只能搭个单节点的&#xff1b;后来买了一台便宜的&#xff0c;所以就有了两…

MIT6.s081 2021 Lab Utilities

Boot xv6 按照示例切换到 util 分支后&#xff0c;看到目录下包含 Makefile 文件&#xff0c;执行 make qemu 即可。 sleep 思路 借助系统调用 sleep 实现一个命令行程序&#xff0c;关键是要找到封装了系统调用的 C 函数的位置&#xff0c;根据提示&#xff1a; … user/u…

【LLM】GLM系列模型要点

note 文章目录 noteGLM一、数据层面1. 预训练数据 二、GLM4模型层面三、GLM-4 All Tools四、GLM的其他技术Reference GLM Paper&#xff1a;https://arxiv.org/abs/2406.12793 GitHub&#xff1a;https://github.com/THUDM HF&#xff1a;https://huggingface.co/THUDM 经过…

将独立的 Python 网络应用程序分发给非技术用户

1. 问题背景 我们需要编写一个 Python 网络应用程序&#xff0c;供教师和学生在课堂上使用。该应用程序将在托管的网站上运行&#xff0c;但我们也希望用户能够下载一个自包含的应用程序&#xff0c;以便他们可以在本地安装&#xff0c;以获得更好的性能或他们根本无法在教室中…

【Solr 学习笔记】Solr 源码启动教程

Solr 源码启动教程 本教程记录了如何通过 IDEA 启动并调试 Solr 源码&#xff0c;从 Solr9 开始 Solr 项目已由 ant 方式改成了 gradle 构建方式&#xff0c;本教程将以 Solr 9 为例进行演示&#xff0c;IDE 选择使用 IntelliJ IDEA。 Solr github 地址&#xff1a;https://gi…

对比A100和4090:两者的区别以及适用点

自2022年年末英伟达发布4090芯片以来&#xff0c;这款产品凭借着其优异的性能迅速在科技界占据了一席之地。现如今&#xff0c;不论是在游戏体验、内容创作能力方面还是模型精度提升方面&#xff0c;4090都是一个绕不过去的名字。而A100作为早些发布的产品&#xff0c;其优异的…

盘点5款最热门的AI绘画软件!总有一款是你的菜

在数字化艺术日益盛行的今天&#xff0c;AI绘画软件成为了创作者们的新宠。这些软件不仅能够帮助艺术家们快速生成独特的艺术作品&#xff0c;还能为普通用户带来全新的绘画体验。今天&#xff0c;我们就来盘点五款最热门的AI绘画软件&#xff0c;看看哪一款是你的菜&#xff0…

Kubernates容器化JVM调优笔记(内存篇)

Kubernates容器化JVM调优笔记&#xff08;内存篇&#xff09; 先说结论背景思路方案 先说结论 1、首先如果是JDK8&#xff0c;需要使用JDK8_191版本以上&#xff0c;才支持容器化环境和以下参数&#xff0c;否则就更新到JDK10以上&#xff0c;选择对应的镜像构建就行了 2、在容…

Python使用策略模式绘制图片分析多组数据

趋势分析&#xff1a;折线图静态比较&#xff1a;条形图分布分析&#xff1a;箱线图离散情况&#xff1a;散点图 import matplotlib.pylab as plt from abc import ABC, abstractmethod import seaborn as sns import pandas as pd import plotly.graph_objects as go import p…

03 Shell编程之循环语句与函数

目录 3.1 for 循环语句 3.1.1 for 语句的结构 3.1.2 for 语句应用示例 1. 根据姓名列表批量添加用户 2. 根据IP地址列表检查主机状态 3.2 使用while循环语句 3.2.1 while语句的结构 3.2.2 while语句应用示例 1. 批量添加规律编号的用户 2. 猜价格游戏 3.3 until 循环语句 3.…

aws的eks(k8s)ingress+elb部署实践

eks&#xff08;k8s&#xff09;版本1.29 ingress 版本1.10.0 负载均衡elb 1. 创建Ingress-Nginx服务 部署项目地址【点我跳转】推荐自定义部署 可绑定acm证书什么的自己属性 这里就是aws上面Certificate Manager产品上面创建证书 导入 创建都行 对应集群版本推荐阵列GitH…

Arc2Face - 一张图生成逼真的多风格人脸,本地一键整合包下载

Arc2Face是用于人脸的基础模型训练&#xff0c;可批量生成超高质量主题的AI人脸艺术风格照&#xff0c;完美复制人脸。只需一张照片&#xff0c;几秒钟&#xff0c;即可批量生成超高质量主题的AI人脸艺术风格照&#xff0c;完美复制人脸。 Arc2Face 是一个创新的开源项目&…

测评:【ONLYOFFICE】版本更迭与AI加持下的最新ONLYOFFICE桌面编辑器8.1

你是否还在为没有一款合适的在线桌面编辑器而苦恼&#xff1f;你是否还在因为办公软件的选择过少而只能使用WPS或者office&#xff1f;随着办公需求的不断变化和发展&#xff0c;办公软件也在不断更新和改进。ONLYOFFICE 作为一款全功能办公软件&#xff0c;一直致力于为用户提…

WordPress如何删除前端评论中的网址字段?

前面跟大家分享的『WordPress插件Comment Link Remove and Other Comment Tools&#xff0c;删除评论网址字段』一文&#xff0c;通过安装插件可轻松删除前端评论中的网址字段&#xff0c;不过有些站长不喜欢安装插件&#xff0c;那么是否可以通过纯代码去掉网址字段呢&#xf…

车辆检测之图像识别

1. 导入资源包 import torch.nn as nn import tkinter as tk from tkinter import filedialog, messagebox from PIL import Image, ImageTk,ImageDraw,ImageFont import torch from torchvision import transforms, models from efficientnet_pytorch import EfficientNet im…

微信QQ视频裂变加群推广强制分享引流系统

用户在达到一定观看次数后&#xff0c;需要分享给好友或群组。只有好友点击推广链接后&#xff0c;观看次数才会增加。 通过引导用户分享至QQ和微信&#xff0c;实现快速裂变引流的效果&#xff01; 视频裂变推广程序通过强制分享链接&#xff0c;引导用户转发&#xff0c;从…