根号2的程序计算方法(Python)(编程求根号2)
ztj100 2025-05-02 22:37 29 浏览 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次.....等等的开方计算方式了?
总结
有时候思路正确了,所要做的反而就很少了!
我在心里十分佩服前人的智慧与伟大!
一起努力,加油!
相关推荐
- 30天学会Python编程:16. Python常用标准库使用教程
-
16.1collections模块16.1.1高级数据结构16.1.2示例...
- 强烈推荐!Python 这个宝藏库 re 正则匹配
-
Python的re模块(RegularExpression正则表达式)提供各种正则表达式的匹配操作。...
- Python爬虫中正则表达式的用法,只讲如何应用,不讲原理
-
Python爬虫:正则的用法(非原理)。大家好,这节课给大家讲正则的实际用法,不讲原理,通俗易懂的讲如何用正则抓取内容。·导入re库,这里是需要从html这段字符串中提取出中间的那几个文字。实例一个对...
- Python数据分析实战-正则提取文本的URL网址和邮箱(源码和效果)
-
实现功能:Python数据分析实战-利用正则表达式提取文本中的URL网址和邮箱...
- python爬虫教程之爬取当当网 Top 500 本五星好评书籍
-
我们使用requests和re来写一个爬虫作为一个爱看书的你(说的跟真的似的)怎么能发现好书呢?所以我们爬取当当网的前500本好五星评书籍怎么样?ok接下来就是学习python的正确姿...
- 深入理解re模块:Python中的正则表达式神器解析
-
在Python中,"re"是一个强大的模块,用于处理正则表达式(regularexpressions)。正则表达式是一种强大的文本模式匹配工具,用于在字符串中查找、替换或提取特定模式...
- 如何使用正则表达式和 Python 匹配不以模式开头的字符串
-
需要在Python中使用正则表达式来匹配不以给定模式开头的字符串吗?如果是这样,你可以使用下面的语法来查找所有的字符串,除了那些不以https开始的字符串。r"^(?!https).*&...
- 先Mark后用!8分钟读懂 Python 性能优化
-
从本文总结了Python开发时,遇到的性能优化问题的定位和解决。概述:性能优化的原则——优化需要优化的部分。性能优化的一般步骤:首先,让你的程序跑起来结果一切正常。然后,运行这个结果正常的代码,看看它...
- Python“三步”即可爬取,毋庸置疑
-
声明:本实例仅供学习,切忌遵守robots协议,请不要使用多线程等方式频繁访问网站。#第一步导入模块importreimportrequests#第二步获取你想爬取的网页地址,发送请求,获取网页内...
- 简单学Python——re库(正则表达式)2(split、findall、和sub)
-
1、split():分割字符串,返回列表语法:re.split('分隔符','目标字符串')例如:importrere.split(',','...
- Lavazza拉瓦萨再度牵手上海大师赛
-
阅读此文前,麻烦您点击一下“关注”,方便您进行讨论和分享。Lavazza拉瓦萨再度牵手上海大师赛标题:2024上海大师赛:网球与咖啡的浪漫邂逅在2024年的上海劳力士大师赛上,拉瓦萨咖啡再次成为官...
- ArkUI-X构建Android平台AAR及使用
-
本教程主要讲述如何利用ArkUI-XSDK完成AndroidAAR开发,实现基于ArkTS的声明式开发范式在android平台显示。包括:1.跨平台Library工程开发介绍...
- Deepseek写歌详细教程(怎样用deepseek写歌功能)
-
以下为结合DeepSeek及相关工具实现AI写歌的详细教程,涵盖作词、作曲、演唱全流程:一、核心流程三步法1.AI生成歌词-打开DeepSeek(网页/APP/API),使用结构化提示词生成歌词:...
- “AI说唱解说影视”走红,“零基础入行”靠谱吗?本报记者实测
-
“手里翻找冻鱼,精心的布局;老漠却不言语,脸上带笑意……”《狂飙》剧情被写成歌词,再配上“科目三”背景音乐的演唱,这段1分钟30秒的视频受到了无数网友的点赞。最近一段时间随着AI技术的发展,说唱解说影...
- AI音乐制作神器揭秘!3款工具让你秒变高手
-
在音乐创作的领域里,每个人都有一颗想要成为大师的心。但是面对复杂的乐理知识和繁复的制作过程,许多人的热情被一点点消磨。...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 30天学会Python编程:16. Python常用标准库使用教程
- 强烈推荐!Python 这个宝藏库 re 正则匹配
- Python爬虫中正则表达式的用法,只讲如何应用,不讲原理
- Python数据分析实战-正则提取文本的URL网址和邮箱(源码和效果)
- python爬虫教程之爬取当当网 Top 500 本五星好评书籍
- 深入理解re模块:Python中的正则表达式神器解析
- 如何使用正则表达式和 Python 匹配不以模式开头的字符串
- 先Mark后用!8分钟读懂 Python 性能优化
- Python“三步”即可爬取,毋庸置疑
- 简单学Python——re库(正则表达式)2(split、findall、和sub)
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)