平方,开根号在java中是很简单的,Math.sqrt(double n)或者 Math.pow(double a, double b),求a的b次方。但是我们可以自己想想,这些方法到底是怎么实现的。

就拿开根号来解释,它有两种方法,二分法和牛顿迭代法。

二分法:

比如求根号5

第一步:折半:       5/2=2.5

第二步:平方校验:  2.5*2.5=6.25>5,并且得到当前上限2.5,记录。

第三步:再次向下折半:2.5/2=1.25

第四步:平方校验:1.25*1.25=1.5625<5,得到当前下限1.25,记录

第五步:再次折半:2.5-(2.5-1.25)/2=1.875

第六步:平方校验:1.875*1.875=3.515625<5,得到当前下限1.875,替换下限值

......

一直到与5的差值在你定义的误差范围内才结束循环

代码:

import java.text.DecimalFormat;

public class Main {

    public static double sqrt(double num){
if(num<0) {
return -1;
} double low = 0;
double high = num/2;
double precision = 0.000001;
//格式化,保证输出位数
DecimalFormat df = new DecimalFormat("#.00"); double res = high;
while(Math.abs(num-(res*res))>precision) {
if(high*high > num) {
double n= high - (high-low)/2;
if(n*n>num) {
high = n;
} else if(n*n<num){
low = n;
}else {
return Double.valueOf(df.format(n));
}
res = n; } else if(high*high < num){
double m = high + (high-low)/2;
if(m*m>num) {
low = high;
high = m;
} else if(m*m<num){
low = high;
high = m;
}else {
return Double.valueOf(df.format(m));
}
res = m;
} else {
return Double.valueOf(df.format(high));
}
} return Double.valueOf(df.format(res));
} public static void main(String[] args) {
double a = 7;
System.out.println(sqrt(37));
}
}

牛顿迭代法:

其实就是逼近的思想,例如我们要求a的平方根,首先令f(x)=x^2-a,那么我们的目的就是求得x使得f(x)=0,也就是求x^2-a这条曲线与x轴的交点,画图举例:

由函数f(x)=x^2-a,我们求导可以知道,函数上任意一点(x,y)的切线的斜率为2x。假设过点(x0,y0)的切线方程为y=kx+b,那么切线与x轴的交点横坐标为-b/k。而b=y0-kx0,k=2x0,y0=x0^2-a,化简-b/k=(x0+a/x0)/2。

也就是说(x0+a/x0)/2是过点(x0,y0)的切线与x轴的交点的横坐标。记(x0+a/x0)/2=x',继续求过点(x',f(x'))的切线与x轴的交点的横坐标x'',很明显x''比x'更靠近函数f(x)=x^2-a与x轴的交点的横坐标(即a的正平方根)。逐渐的逼近f(x)=0;

所以公式为:x' = (x'+a/x')/2。

代码:

import java.text.DecimalFormat;

public class Main1 {
public static double sqrt(double x) {
if(x<0) {
return -1;
}
//格式化,保证输出位数
DecimalFormat df = new DecimalFormat("#.00"); double k = x;
double precision = 0.000001;
while((k*k-x)>precision) {
k=0.5*(k+x/k);
}
return Double.valueOf(df.format(k));
} public static void main(String[] args) {
double a = 9;
System.out.println(sqrt(a));
}
}

参考文献:

二分法和牛顿迭代法求平方根(Python实现)

牛顿迭代法求平方根

Java-求根号n的更多相关文章

  1. 求根号m(巴比伦算法)

    巴比伦算法是针对求根号m的近似值情况的,它的思想是这样的: 设根号m=X0,则如果枚举有答案X(X<X0),则m/X>X0,当精度要求不高的时候,我们可以看成X=m/X=X0,而如果精度要 ...

  2. Java求素数时出现错误

    Java求素数时出现错误 1.具体错误如下 No enclosing instance of type Prime is accessible. Must qualify the allocation ...

  3. 用java求一个整数各位数字之和

    /* * 用java求一个整数各位数字之和 */ public class Test02 { public static void main(String[] args) { System.out.p ...

  4. Java求字符串中出现次数最多的字符

    Java求字符串中出现次数最多的字符  [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/51933611      Java ...

  5. 年年有余之java求余的技巧集合

    背景 传说里玉皇大帝派龙王马上降雨到共光一带,龙王接到玉皇大帝命令,立马从海上调水,跑去共光施云布雨,但粗心又着急的龙王不小心把海里的鲸鱼随着雨水一起降落在了共光,龙王怕玉皇大帝责怪,灵机一动便声称他 ...

  6. java求两个数中的大数

    java求两个数中的大数 java中的max函数在Math中 应用如下: int a=34: int b=45: int ans=Math.max(34,45); 那么ans的值就是45.

  7. java求两个圆相交坐标

    最近由于项目需要,根据两个圆函数求出相交的坐标.实现代码如下,另感谢两圆求交点算法实现Java代码,虽然他所贡献的代码中存在问题,但仍有借鉴意义. 1.两个圆相交的数学求法 在中学数学中我们知道,一个 ...

  8. java求字符串数组交集、并集和差集

    import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.Ma ...

  9. JAVA求集合中的组合

    好几个月没弄代码了,今天弄个求组合的DEMO 思路是将集合的每个值对照一个索引,索引大小是集合的大小+2.索引默认为[000...000],当组合后选取的组合值demo为[0100..00].然后根据 ...

  10. JAVA求圆的面积

    import java.text.DecimalFormat;import java.util.Scanner; public class TheAreaOfCircle { public stati ...

随机推荐

  1. Linux NFS挂载报错wrong fs type, bad option, bad superblock

    1.故障现象 2.解决方案 1.故障现象 我的测试环境有一个NAS,之前配置都是按照测试需求在/etc/fstab里添加配置挂载选项: vi /etc/fstab 192.168.1.2:/mnt/H ...

  2. NC17871 CSL分苹果

    题目链接 题目 题目描述 CSL手上有n个苹果,第i个苹果的质量是wi,现在他想把这些苹果分给他的好朋友wavator和tokitsukaze.但是CSL为了不让他们打架,根据质量决定尽量地均分成两堆 ...

  3. NVME(学习笔记二)—CMB

    什么是CMB 在NVMe Express 1.2 Spec中开始支持一个特性,那就是CMB(Controller Memory Buffer),是指SSD控制器内部的读写存储缓冲区,与HMB(Host ...

  4. 用于解析FBNeo游戏数据的Python3脚本

    FBNeo在代码中存储了游戏的元数据, 其数据格式为 struct BurnDriver BurnDrvCpsStriderua = { "striderua", "st ...

  5. 基于tensorflow的RBF神经网络案例

    1 前言 在使用RBF神经网络实现函数逼近中,笔者介绍了使用 Matlab 训练RBF神经网络.本博客将介绍使用 tensorflow 训练RBF神经网络.代码资源见:RBF案例(更新版) 这几天,笔 ...

  6. 【framework】IMS启动流程

    1 前言 ​ IMS 是 InputManagerService 的简称,主要负责输入事件管理. 1.1 基本概念 输入设备:屏幕.电源/音量.键鼠.充电口.蓝牙.wifi 等 设备节点:当输入设备可 ...

  7. CSS隐藏元素的方法

    CSS隐藏元素的方法 使用CSS隐藏元素的主要方式有diaplay: none;.opacity: 0;.visibility: hidden;.position: absolute; overflo ...

  8. ElasticSearch入门安装与SpringBoot集成实战

    介绍 Elasticsearch 是一个实时分布式搜索和分析引擎,一般用于全文搜索.结构化搜索,分析或者三者混用. 它的底层是基于Apache Lucene(TM)的开源搜索引擎,但是lucene只是 ...

  9. Java使用正则表达式判断字符串中是否包含某子字符串

    需求: 给定一个字符串s,判断当s中包含"tree fiddy"或"3.50"或"three thirty"子字符串返回true,否则返回f ...

  10. spring boot使用自带缓存

    项目地址:https://gitee.com/indexman/spring_boot_in_action 下面就介绍一下如何使用spring boot自带的缓存.按步骤来操作即可,不懂的可以去看项目 ...