我以前想到的方法

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

假设求根号 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 次……等等的开方计算方式了?

总结

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

对于其他特殊值,如圆周率 π ,自然数 e 则有泰勒多项式展开形式。

有兴趣的小伙伴可以用代码写的试试。

根号2计算机代码,根号 2 的程序计算方法相关推荐

  1. 计算机代码图表,微信小程序图表插件(wx-charts)实例代码

    微信小程序图表工具,charts for WeChat small app 基于canvas绘制,体积小巧 支持图表类型 饼图 pie 圆环图 ring 线图 line 柱状图 column 区域图 ...

  2. vbs计算机代码,vbs运行一个程序的代码

    在VB 窗体中放置一个按扭 Command1,双击按扭,在其 Click() 事件中添加你的程序就可以了 如: Private Sub Command1_Click() On Error Resume ...

  3. 对不起用计算机代码怎么说,一个程序员的自白书:“对不起,我做错了”

    介绍 这应该是我的自白书.这两天要重构一个函数,因为出现的问题是有多个login方法,同事A在添加功能的时候,需要同时维护多个login,在整个过程中,我犯了很多错误.就整件事,故有了此文.--就权当 ...

  4. 格子玻尔兹曼方法书中,计算机代码(Fortran语言)FDM的输出结果是什么,为什么显示程序“[25024] Console1.exe”已退出,返回值为 0 (0x0)。

    格子玻尔兹曼方法书中,计算机代码(Fortran语言)FDM的输出结果是什么,为什么显示程序"[25024] Console1.exe"已退出,返回值为 0 (0x0).

  5. 盲人如何学计算机编程,你知道盲人程序员是如何写代码的吗?

    原标题:你知道盲人程序员是如何写代码的吗? 程序员生涯以困难模式开局:出生在伊朗,生下来就看不见.14岁学VB编程.大学读计算机专业.是PHP程序员.一开始在工作中被歧视.始终热爱编程.很励志. 这是 ...

  6. 计算机论文答辩代码讲解,计算机专业毕业论文答辩的程序讲解

    毕业论文答辩对毕业生来说是一种知识水平和表达能力的考验,下面是CN人才网为大家整理的计算机专业毕业论文答辩的程序讲解,欢迎参考~ 计算机专业毕业论文答辩的程序讲解 一.毕业论文答辩的一般程序 1.学员 ...

  7. 对人脑而言,阅读计算机代码和阅读语言有何不同?

    作者 | Anne Trafton 翻译 | 火火酱,责编 | 晋兆雨 出品 | AI科技大本营 头图 | 付费下载于视觉中国 神经科学家们发现,人类在解读代码时会激活一个通用的大脑区域网络,但不会激 ...

  8. 《编写高质量代码:改善c程序代码的125个建议》——建议3-5:避免使用浮点数作为循环计数器...

    本节书摘来自华章计算机<编写高质量代码:改善c程序代码的125个建议>一书中的第1章,建议3-5,作者:马 伟 更多章节内容可以访问云栖社区"华章计算机"公众号查看. ...

  9. 《编写高质量代码:改善c程序代码的125个建议》——建议2-6:防止无符号整数回绕...

    本节书摘来自华章计算机<编写高质量代码:改善c程序代码的125个建议>一书中的第1章,建议2-6,作者:马 伟 更多章节内容可以访问云栖社区"华章计算机"公众号查看. ...

最新文章

  1. Ant Design Pro 网络请求,视图绑定model并且渲染到页面 umi-request
  2. 《老子》第八十一章 信言不美,美言不信
  3. 如何注册域名-买服务器-备案-建设网站
  4. springboot拦截了静态资源css,js,jpg,png等
  5. 线性回归实现——梯度下降
  6. 用scrapy框架爬虫时遇到的错误ValueError: Missing scheme in request url: //scpic3.chinaz.net/Files/pic/pic 9/2021
  7. Ceres配置(vs2013+Win10)
  8. 关于e的等式及相关证明
  9. braintree php 开发,PHP关于Braintree支付
  10. UVa——110303 Common Permutation(字符串)
  11. 樽海鞘群算法原理详解
  12. 海康威视摄像头网线连接笔记本电脑,客户端提示:1连接设备失败。设备不在线或网络原因引起的连接超时等。(HCNetSDK.dll[7].)解决方案
  13. XP系统电脑连不上服务器,windowsxp系统电脑连不上路由器如何解决
  14. android 11.0 12.0Launcher3去掉默认的google搜索栏
  15. windows下cfree5中%d输出浮点数的问题
  16. 2022-2028全球与中国不锈钢毛细管柱市场现状及未来发展趋势
  17. 四、文件管理(三)文件系统
  18. 《人类简史》这本烧脑书风靡全球的秘密是什么?
  19. 电脑清灰记录(惠普暗影精灵5)
  20. javascript案例31——简易ATM机、简易银行、存钱取钱。

热门文章

  1. erdas遥感图像几何校正_实验二 ERDAS遥感图像的几何校正
  2. 如何获取微信公众平台图文消息的永久链接
  3. C# 定时任务 调度框架 WebWork (Quartz.NET) Web版的Windows服务
  4. [ZZ]一些界面标准规范(来自因特网)
  5. 二阶常系数非齐次线性微分方程特解的设定规则
  6. python 创建目录时间_python实现根据当前时间创建目录并输出日志
  7. 计算机网络专题讲座,我院举行《计算机网络新技术》专题讲座
  8. 5.2 lilyglyphs包
  9. 计算机在汽车专业中的应用,浅谈计算机技术在汽车行业中的应用.doc
  10. vc 文字转换到机内码,输入汉字和数字, 输出一串16进制码(数字-〉ASII码,汉字—〉国标码)...