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

一、袖珍计算器

袖珍计算器方法主要运用到了我们高数上所学的关于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…

《Linux》 Part1 top 指定多个程序名查看状态

《Linux》 Part1 top 指定多个程序名查看状态 1.top 查看多个程序状态命令2.单个进程状态查看命令 1.top 查看多个程序状态命令 processes("nginx" "apache2") tmp""for process in "${processes[]}"; dopids$(pgrep "$process&…

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. 以下关于程序设计语言的描述&#xff0c;错误的选项是&#xff1a; A Python语言是一种脚本编程语言 B 汇编语言是直接操作计算机硬件的编程语言 C 程序设计语言经历了机器语言、汇编语言、脚本语言三个阶段 D 编译和解释的区别是一次性翻译程序还是每次执行时都要翻…

将独立的 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…

mysql:mysql XA事务的简单例子

# 测试 创建测试表&#xff0c;并写入数据 create table cash_account(name varchar(10),balance decimal(10,2) ) engineinnodb;insert into cash_account values(Tom, 210000);第一个会话&#xff0c;执行XA事务的业务内容 xa start transfer_of_account,cash;update cas…

对比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…

TC397的Trap机制

Trap机制 Trap是MCU内部引发的硬件中断。 Trap是由不可屏蔽中断 (NMI)、指令异常、内存管理异常或非法访问等事件导致的。 Trap

秒杀系统设计与实现

将从11 个点来进行秒杀系统得设计与实现分析。 1、哪些地方存在瞬时高并发&#xff1f; 1. 预抢购业务&#xff1a;活动未正式开始前&#xff0c;先进行活动预约。在真正秒杀的时间点&#xff0c;很多数据都是预处理好的了&#xff0c;可以很大程度削减系统压力。比如&#xff…

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…