牛顿迭代法和二分法都是手撸开根比较常见的方法,原以为Java sqrt的源码是用牛顿迭代法实现的,结果看了一下发现不是牛顿迭代法。

Java sqrt方法是一个native方法,需要下载openjdk源码包进行查看

官网下载/提取码:p9qsopenjdk8提取码:p9qs​pan.baidu.com

sqrt代码路径为:openjdk\jdk\src\share\native\java\lang\fdlibm\src\e_sqrt.c

或者戳下面这个链接在线查看代码http://www.netlib.org/fdlibm/e_sqrt.c​www.netlib.org

先解释一下牛顿迭代法:

求解方程的近似根时,先选取一个近似值作为初始值,然后不断取函数在这个点的切线与x轴的交点作为新的迭代值,最终迭代值会收敛至零点处。牛顿迭代法

牛顿迭代公式:

求解一个数的算术平方根例如

,这个问题可以转化成求解

的正根,将 f(x)代入迭代公式即可求出求解算术平方根的牛顿迭代公式:例如求解

先选取一个数作为迭代初始值,这里选取36/2的值也就是18作为初始值

则迭代过程为:18->10->6.8->6.047->...

然而Java sqrt源码中并不是用这个方法实现的。

Java sqrt源码中给出的方法描述为:Bit by bit method using integer arithmetic. (Slow, but portable)

逐位使用数值运算的方法,更慢但是更合适(泛化和鲁棒)

具体实现上也给出了解释:

1、标准化

假如现在要求

,那么通过2的偶数次幂,将x映射到[1,4)的范围内,使其满足下式:

则求

可以转化为求

2、逐位计算

为最终要求的

逐二进制位计算迭代而来,初始化

为1,因为y的范围是[1,4),所以

的范围是[1,2)。迭代方法如下:判断

是否成立;

如果成立则

;

否则

举个例子便于理解,假设现在要求

则根据第一步得到:

迭代: ,初始化

······

最终

可以看出这种方法不同于牛顿迭代法,它将带求解的数映射于[1,4)范围内,通过逐位计算,逐步缩小解的精度,逼近结果。

代码注释中还给出了一个优化方法,因为以上迭代过程涉及到平方的操作,为了优化这一点,可以将

其中

,迭代过程转化为:判断

是否成立;

如果成立则

;

否则

由此消除平方操作

可以知道这种逐位计算的方法求解收敛速度某些时候或许比不上牛顿迭代法,但避免了许多乘法和除法操作,所以鲁棒性很好。

此外,代码注释中还介绍了另一种相比牛顿迭代法而言不需要除法运算的方法,倒根迭代(自己乱翻译的)。将牛顿迭代法中的迭代值换成原来的倒数进行迭代。但是增加了许多乘法的操作。

论文链接:Square Root Without Division​people.eecs.berkeley.edu

源码处理的double数据有52位有效位,在处理时将其分成了高位和低位分开处理,涉及到许多位运算,代码可读性不高,所以不详细讨论。

java sqrt函数源码_Java sqrt源码解析相关推荐

  1. java hashset 源码_Java集合源码分析-HashSet和LinkedHashSet

    前两篇文章分别分析了Java的ArrayList和LinkedList实现原理,这篇文章分析下HashSet和LinkedHashSet的源码.重点讲解HashSet,因为LinkedHashSet是 ...

  2. java地图源码_Java集合源码分析(四)HashMap

    一.HashMap简介 1.1.HashMap概述 HashMap是基于哈希表的Map接口实现的,它存储的是内容是键值对映射.此类不保证映射的顺序,假定哈希函数将元素适当的分布在各桶之间,可为基本操作 ...

  3. 用java创建一个学生数据库_java项目源码-数据库创建学生信息管理系统

    java项目源码-数据库创建学生信息管理系统 create data base JavaTest go use JavaTest go create table 登陆 (用户名 char(20) pr ...

  4. java file源码_java File源码理解,探索File路径

    1.方法: new File(path); 我们知道根据输入的路径path的不同 ,File可以根据path的不同格式,来访问文件.那么,path的形式有几种呢? 根据源码 可以知道,输入的路径pat ...

  5. 《游戏学习》java代码实现《愤怒的小鸟》实战源码

    项目代码结构目录 部分代码展示 import javax.swing.ImageIcon; import org.jbox2d.collision.shapes.CircleShape; import ...

  6. Java实战项目之人力资源管理系统【源码+课后指导】_Java毕业设计/计算机毕业设计

    对就业和毕业都有帮助的Java实战项目来咯--人力资源管理系统!Java实战项目之人力资源管理系统[源码+课后指导]_Java毕业设计/计算机毕业设计https://www.bilibili.com/ ...

  7. java钢琴键_javapiano Java Piano模拟钢琴效果的完整源码 联合开发网 - pudn.com

    javapiano 所属分类:Java编程 开发工具:Java 文件大小:32KB 下载次数:10 上传日期:2014-04-15 21:09:50 上 传 者:王小强 说明:  Java Piano ...

  8. java源码 1.8_Java源码下载和阅读(JDK1.8/Java 11)

    文章目录 1.openjdk的Java源码 2. Oracle 的Java源码 1.openjdk的Java源码 JDK10的源码可以直接从openjdk上下载.下载地址:openjdk-10_src ...

  9. Java的三种代理模式完整源码分析

    Java的三种代理模式&完整源码分析 Java的三种代理模式&完整源码分析 参考资料: 博客园-Java的三种代理模式 简书-JDK动态代理-超详细源码分析 [博客园-WeakCach ...

  10. java共享租车信息管理系统jsp源码

    介绍: java web项目共享租车jsp源码,基于servlet+jsp+jdbc的后台管理系统,包含5个模块:汽车账户部管理.租车账户部管理.汽车信息管理表.租车记录表.租车租聘表.功能完整,均能 ...

最新文章

  1. 2018 CVPR GAN 相关论文调研 (自己分了下类,附地址哦)
  2. Linux下yum方式安装mysql 以及卸载mysql
  3. python主要用途-学习Python的三大主要用途
  4. oracle中的decode的使用
  5. Mybatis(13)动态sql语句if/where/foreach
  6. UNITY关于阴影打开关闭的设置
  7. JDG战队与英特尔达成为期两年的冠名合作
  8. SourceTree的使用
  9. linux下使用./configure报-bash: ./configure: No such file or directory
  10. linux修改环境截图,Linux环境下php实现给网站截图的方法.docx
  11. ARM 和 RISC-V 公然开撕,GNOME 之父指责 ARM
  12. OpenEmu for mac(苹果系统原生游戏模拟软件)中文版
  13. 光栅(Raster)性能优化
  14. tensorflow打印模型图_tensorflow 实现打印pb模型的所有节点
  15. debian重启ssh服务_Win10自带的ssh客户端key权限设置
  16. Ubuntu解决外接2K屏分辨率低问题
  17. 信息系统项目管理师必背核心考点(四十九)合同法
  18. linux 输出到文件 新,如何将Linux命令输出保存到文件的两种方法
  19. 程序员如何保持身心健康?
  20. 期末前端web大作业:用DIV+CSS技术设计的动漫网站

热门文章

  1. 要做最快的男人,教你用Python写一个打字测试器测试你的打字速度~
  2. email英文计算机求职信,求职信_计算机英文求职信
  3. BIOS中英文对照表!
  4. 基于Vue实现动态组织结构图
  5. 【沙龙干货分享】你要知道的N个Android适配问题
  6. 思维导图ubuntu_适用于Linux用户的10款出色的免费思维导图软件
  7. homeassistant 快速入门
  8. 单片机无线通信学习笔记
  9. MySql round用法
  10. foxmail 设置签名和信纸