百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

根号2的程序计算方法(Python)(编程求根号2)

off999 2024-09-23 11:35 54 浏览 0 评论

平常我们用到的 sqrt 函数求一个数的算术平方根,以前一直好奇究竟是如何计算的。

这篇文章我们就一起来探究一下。


二分法

以前我想到的一种方式是二分法;

假设求根号2的平方根;

假设最开始 min = 1.0,max = 2.0;

则它们的中间值 val = (min+max)/2.0;

然后判断 num = val*val 的结果,

如果 num > 2;则 max = val;

如果 num < 2;则 min = val;

如果 num = 2;则 算术平方根是 val,返回。


当然有人会问,一直不等于能,当然我们可以设置计算次数;

比如执行超过 20 次后就返回,这样可以避免无线循环下去。

然而这种方法的收敛速度实在太慢,导致要计算很多次才能达到比较高的精度。


牛顿的方法

网上看到一个说是牛顿的计算方法,假设 f(x) = x^2-2;

在 x^2-2 的曲线上面,先找一个点A(X0,Y0),

过点A做曲线的切线交x轴于B(X1,0);

找到当前点B对应曲线上的点C(X1,Y1);

过点C做曲线的切线交x轴于D(X2,0);

找到当前点D对应曲线上的点E(X2,Y2);

过点E做曲线的切线交x轴于F(X3,0);

.........

按照这个过程一直下去,B D F....将会离曲线与x轴的交点越来越近,即逼近原理。



数学方法

那上面的坐标如何求取呢,对于点A,可以带入一个方便的坐标(1,-1);

由于CD是切线,点C为切点,则有如下关系:

斜率 y' = BC/BD

而:BD 可以看成是点B的x轴坐标减去点D的x轴坐标,即 BD = X1-X2;

BC 就是C点的y值,即Y1;

上面关系就变成:y' = Y1/(X1-X2)

转换一下:X1-X2 = Y1/y'

X2 = X1-Y1/y'

转换成标准的写法,则有: Xn = Xn-1 - f(Xn-1) / f '(Xn-1)

对于曲线 x^2-2 任意一点的切线可以根据多项式导数方式获取,即 f '(Xn-1) = 2x;

则有 Xn = Xn-1 - f(Xn-1) / 2x;

将A点(X0,Y0) 由曲线上的点(1,-1)带入时,

X1 = 1 - (-1/2*1) = 1.5; 此时 Y1 = 1.5^2-2 = 2.25-2 = 0.25;

X2 = 1.5 - 0.25/2*1.5 = 1.416666...667; 此时 Y1 = 0.0069444444...

以此类推

X6 = 1.4142135623730950488016887242096980785696718753772.......


对比网上查找到的根号2前100为如下:

1.414213562373095048801688724209698078569671875376948073176679737990732478462107038850....

可以看到X6写出来的,仅仅是最后两位开始不一样。可见运算次数仅仅6次,精度已经如此高了。


代码实现

由于C/C++没找到比较稳定的高精度计算数据类,在此用Python代替了。

实现代码如下:

from decimal import Decimal
from decimal import getcontext

work_context = getcontext()
work_context.prec = 1000  // 有兴趣的可以试试更高精度


num = Decimal(2)  // 需要开方的数,可以试试3,5,7,11 。。。

def Xn(x, y):
	x -= y/(x*Decimal(2))
	y = x*x-num
	return (x,y)

x = Decimal(1)
y = x*x-num

for i in range(0,20):  // 计算20次精度已经非常高了
	x, y = Xn(x, y)
	print(x)


第20次结果:(好像精度已经达到1000位了)
1.414213562373095048801688724209698078569671875376948073176679737990732478462
10703885038753432764157273501384623091229702492483605585073721264412149709993
58314132226659275055927557999505011527820605714701095599716059702745345968620
14728517418640889198609552329230484308714321450839762603627995251407989687253
39654633180882964062061525835239505474575028775996172983557522033753185701135
43746034084988471603868999706990048150305440277903164542478230684929369186215
80578463111596668713013015618568987237235288509264861249497715421833420428568
60601468247207714358548741556570696776537202264854470158588016207584749226572
26002085584466521458398893944370926591800311388246468157082630100594858704003
18648034219489727829064104507263688131373985525611732204024509122770022694112
75736272804957381089675040183698683684507257993647290607629969413804756548237
28997180326802474420629269124859052181004459842150591120249441341728531478105
80360337107730918286931471017111168391658172688941975871658215212822951848847

是不是感到震惊,代码竟然如此短!?

是的,没有看错,就这么一点点。

有兴趣的小伙伴可以试试 https://tool.lu/coderunner/ 的在线编译器;

左上角选择 Python 然后复制上面的代码,运行看看结果。(如下图)

按照同样的方式,大家是不是可以扩展出3次,5次.....等等的开方计算方式了?


总结

有时候思路正确了,所要做的反而就很少了!

我在心里十分佩服前人的智慧与伟大!

一起努力,加油!

相关推荐

阿里云国际站ECS:阿里云ECS如何提高网站的访问速度?

TG:@yunlaoda360引言:速度即体验,速度即业务在当今数字化的世界中,网站的访问速度已成为决定用户体验、用户留存乃至业务转化率的关键因素。页面加载每延迟一秒,都可能导致用户流失和收入损失。对...

高流量大并发Linux TCP性能调优_linux 高并发网络编程

其实主要是手里面的跑openvpn服务器。因为并没有明文禁p2p(哎……想想那么多流量好像不跑点p2p也跑不完),所以造成有的时候如果有比较多人跑BT的话,会造成VPN速度急剧下降。本文所面对的情况为...

性能测试100集(12)性能指标资源使用率

在性能测试中,资源使用率是评估系统硬件效率的关键指标,主要包括以下四类:#性能测试##性能压测策略##软件测试#1.CPU使用率定义:CPU处理任务的时间占比,计算公式为1-空闲时间/总...

Linux 服务器常见的性能调优_linux高性能服务端编程

一、Linux服务器性能调优第一步——先搞懂“看什么”很多人刚接触Linux性能调优时,总想着直接改配置,其实第一步该是“看清楚问题”。就像医生看病要先听诊,调优前得先知道服务器“哪里...

Nginx性能优化实战:手把手教你提升10倍性能!

关注△mikechen△,十余年BAT架构经验倾囊相授!Nginx是大型架构而核心,下面我重点详解Nginx性能@mikechen文章来源:mikechen.cc1.worker_processe...

高并发场景下,Spring Cloud Gateway如何抗住百万QPS?

关注△mikechen△,十余年BAT架构经验倾囊相授!大家好,我是mikechen。高并发场景下网关作为流量的入口非常重要,下面我重点详解SpringCloudGateway如何抗住百万性能@m...

Kubernetes 高并发处理实战(可落地案例 + 源码)

目标场景:对外提供HTTPAPI的微服务在短时间内收到大量请求(例如每秒数千至数万RPS),要求系统可弹性扩容、限流降级、缓存减压、稳定运行并能自动恢复。总体思路(多层防护):边缘层:云LB...

高并发场景下,Nginx如何扛住千万级请求?

Nginx是大型架构的必备中间件,下面我重点详解Nginx如何实现高并发@mikechen文章来源:mikechen.cc事件驱动模型Nginx采用事件驱动模型,这是Nginx高并发性能的基石。传统...

Spring Boot+Vue全栈开发实战,中文版高清PDF资源

SpringBoot+Vue全栈开发实战,中文高清PDF资源,需要的可以私我:)SpringBoot致力于简化开发配置并为企业级开发提供一系列非业务性功能,而Vue则采用数据驱动视图的方式将程序...

Docker-基础操作_docker基础实战教程二

一、镜像1、从仓库获取镜像搜索镜像:dockersearchimage_name搜索结果过滤:是否官方:dockersearch--filter="is-offical=true...

你有空吗?跟我一起搭个服务器好不好?

来人人都是产品经理【起点学院】,BAT实战派产品总监手把手系统带你学产品、学运营。昨天闲的没事的时候,随手翻了翻写过的文章,发现一个很严重的问题。就是大多数时间我都在滔滔不绝的讲理论,却很少有涉及动手...

部署你自己的 SaaS_saas如何部署

部署你自己的VPNOpenVPN——功能齐全的开源VPN解决方案。(DigitalOcean教程)dockovpn.io—无状态OpenVPNdockerized服务器,不需要持久存储。...

Docker Compose_dockercompose安装

DockerCompose概述DockerCompose是一个用来定义和管理多容器应用的工具,通过一个docker-compose.yml文件,用YAML格式描述服务、网络、卷等内容,...

京东T7架构师推出的电子版SpringBoot,从构建小系统到架构大系统

前言:Java的各种开发框架发展了很多年,影响了一代又一代的程序员,现在无论是程序员,还是架构师,使用这些开发框架都面临着两方面的挑战。一方面是要快速开发出系统,这就要求使用的开发框架尽量简单,无论...

Kubernetes (k8s) 入门学习指南_k8s kubeproxy

Kubernetes(k8s)入门学习指南一、什么是Kubernetes?为什么需要它?Kubernetes(k8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。它...

取消回复欢迎 发表评论: