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

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

off999 2024-09-23 11:35 35 浏览 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次.....等等的开方计算方式了?


总结

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

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

一起努力,加油!

相关推荐

还不会deepseek部署到本地?这篇教程手把手教会你

一、为什么要把DeepSeek部署到本地?新手必看的前置知识近期很多读者在后台询问AI工具本地部署的问题,今天以国产优质模型DeepSeek为例,手把手教你实现本地化部署。本地部署有三大优势:数据隐私...

推荐个超实用的Python标准库pathlib,玩转路径操作

pathlib学习Python时,尤其是在进行文件操作和数据处理时,经常会处理路径问题。最常用和常见的是os.path模块,它将路径当做字符串进行处理,如果使用不当可能导致难以察觉的错误,而且...

python中文件读写操作最佳实践——使用 os.path 进行路径操作

在Python中处理文件路径时,使用os.path模块比直接使用字符串拼接更加安全、可靠且跨平台。下面我将详细解释为什么以及如何使用os.path进行路径操作。为什么不应该使用字符串拼接?#不推荐的...

Python如何获取当前文件所在目录的完整路径

在编程的过程中,我们常常会遇到需要获取当前文件所在目录完整路径的需求。那具体该怎么做呢?这是在众多开发者群体中备受关注的一个问题,就像在问答平台上“/questions/3430372/how-d...

python编程之神经网络篇(python的神经网络编程)

#头条创作挑战赛#神经网络发展到今天大致经历了2次兴起和2次衰落,1943年心理学家McCulloch(麦卡洛克)和数学家Pitts(皮茨)参考生物神经系统的工作原理,首次提出建立了MP神经元模型。其...

详解Python整数类型的按位运算(在python中整数)

在Python编程中,按位运算是直接对整数的二进制位进行操作的底层运算,虽然不如逻辑运算常见,但在处理位掩码、状态标志、底层算法优化等场景中至关重要。本文将从基础概念到高级应用,全面解析Python整...

强化学习的改进只是「噪音」?最新预警:冷静看待推理模型进展

机器之心报道编辑:蛋酱、+0「推理」已成为语言模型的下一个主要前沿领域,近期学术界和工业界都取得了突飞猛进的进展。在探索的过程中,一个核心的议题是:对于模型推理性能的提升来说,什么有效?什么无效?De...

了解python3新特性-3(python3介绍)

以下是Python3的其他一些特性:改进了asyncio.run():Python3.7中对asyncio.run()函数进行了改进,可以方便地处理异步任务异常。新增了typing....

python GIL全局解释器锁原理、功能及应用示例

GIL(GlobalInterpreterLock)是Python解释器中的一个机制,它是一把全局锁,用于在同一时间内限制只有一个线程执行Python字节码。以下是GIL的原理、功能以及5个示例:...

python3-运算符优先级(python语言运算符优先级)

#挑战30天在头条写日记#Python运算符优先级以下列出了从最高到最低优先级的所有运算符,相同单元格内的运算符具有相同优先级。运算符均指二元运算,除非特别指出。相同单元格内的运算符从左至右分组...

如何在 Python 中使用 Notion API?

如何在Python中使用NotionAPI并自动编辑数据库。设置NotionAPI和数据库首先,让我们在Notion板中创建一个完整的页面数据库。在本文中,我使用了一个来自我的一个数据库的真实示...

一文了解 Python 的临时文件模块(python tmpfile)

Python的Tempfile模块是用于创建临时文件和文件夹的标准库。当我们需要临时存储数据时,可以创建临时文件,这些文件位于单独的目录中,该目录因操作系统而异,并且这些文件的名称是唯一的。在...

一文带您精通Python 集合(Set):8个不可不知的技巧及示例

在Python中,集合(Set)与列表(List)、字典(Dict)、元组(Tuple)一起构成了基本的数据结构。集合以其独特的无序性和元素唯一性,在处理数据时具有独特的优势。然而,很多人对集合的...

数据类型的&quot;变形记&quot;:解锁Python数据处理效率的关键钥匙

在日常编程中,数据就像流动的河水,而数据类型就是塑造河道的模具。当我们从用户输入、文件读取或网络请求中获取数据时,往往需要像侦探一样验证它们的真实身份,再像魔术师一样将它们转换成需要的形态。这就是数据...

大学 Python 程序设计实验报告:基于组合数据类型

一、实验目的编写Python程序,实现对简单文本的处理,掌握列表、元组、字典等组合类型的应用。二、实验要求掌握字符串的输入和输出。掌握使用切片的方式访问字符串中的值。掌握常见的字符串内建函数的应用。...

取消回复欢迎 发表评论: