java實現(xiàn)開根號的運算方式
java實現(xiàn)開根號的運算
面試的時候,偶然被問到,開根號的實現(xiàn),雖然給面試官講解了思路,但是沒有實際實現(xiàn)過,閑來無事,就把自己的思路寫一下,做個筆記。
如果某個數(shù)字正好可以開根號為2個整數(shù),例如1,4,9等,那就很簡單了。
如果某個數(shù)字不可以正好開根號為2個整數(shù),而且要保留幾位精度,例如:2,3,5等,我們該怎么辦呢?????
首先我們可以把這個數(shù)字分成整數(shù)部分和小數(shù)部分,分別計算。
例如√5≈2.236 我們可以先算出整數(shù)部分為2,然后在根據(jù)保留幾位精度,去計算小數(shù)部分。依次計算十分位、百分位和千分位等,然后把整數(shù)位+十分位+百分位+千分位+。。。,結(jié)果就是我們想要的結(jié)果了。
下面我寫了一個通用的方法,可以根據(jù)傳的參數(shù)來保留精度。
package comc.n;
import java.math.BigDecimal;
public class Square {
public static void main(String[] args) {
System.out.println(Math.sqrt(5));
System.out.println(MathSqure(5, 6));
}
/**
*
* @param n 需要開根號的數(shù)據(jù)
* @param m 需要保留的精度,即幾位小數(shù)
* @return
*/
public static double MathSqure(int n, int m){
double[] arr = new double[m];
if(m >0){
arr = sc(m);
}
int s = sq(n);
return sb(n, s, arr);
}
/**
* 計算整數(shù)位
* @param n
* @return
*/
public static int sq(int n){
if( n == 1){
return 1;
}
int tmp = 0;
for(int i=1;i<=n/2+1;i++){
if(i*i == n){
tmp = i;
break;
}
if(i*i > n){
tmp = i-1;
break;
}
}
return tmp;
}
/**
* 計算要保留幾位小數(shù)
* @param m
* @return
*/
public static double[] sc(int m){
double[] arr = new double[m];
int num = 0;
while(num != m){
double f = 1;
for(int i=0;i<=num;i++){
f = f*10;
}
arr[num] = 1/f;
num++;
}
return arr;
}
/**
* 開根號
* @param n
* @param j
* @param arr
* @return
*/
public static double sb(int n, double j, double[] arr){
double tmp = j;
for(int p=0;p<arr.length;p++){
if(p>0){
j = tmp;//計算過后的值(整數(shù)位+小數(shù)位的和,賦值給j,下面繼續(xù)運算)
}
for(int i=1;i<=9;i++){//小數(shù)位只有九位{0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9}
tmp = i*arr[p]+j;//i*arr[p],相當于每次加0.1,0.2 ...
if(tmp*tmp == n){
return tmp;
}
if(tmp*tmp >n){
//避免丟失精度
BigDecimal c1 = new BigDecimal(Double.toString(tmp));
BigDecimal c2 = new BigDecimal(Double.toString(arr[p]));
tmp = c1.subtract(c2).doubleValue();
break;
}
}
}
return tmp;
}
}輸出結(jié)果:

java實現(xiàn)一定精度的開根號運算
需求:在不借助系統(tǒng)庫的情況下,編寫一個函數(shù),實現(xiàn)開根號的操作,并且保證一定的精度
代碼采用了牛頓迭代法以及二分查找法兩種方式并分別打印了他們的循環(huán)次數(shù)以比較優(yōu)劣:
/**
?* 實現(xiàn)一個函數(shù),完成對v開根號的操作,誤差小于t,不能調(diào)用函數(shù)庫
?*/
public class Sqrt{
? ? /**
? ? ?* 可以使用牛頓迭代法
? ? ?* 首先隨便猜一個近似值x,然后不斷令x等于x和a/x的平均數(shù),迭代個六七次后x的值就已經(jīng)相當精確了
? ? ?*/
? ? public static double iter(int v,double t){
? ? ? ? int i = 0;
? ? ? ? // 首先預(yù)估一個數(shù)
? ? ? ? double random = v >> 1;
? ? ? ? while(abs((v-random*random)) > t){
? ? ? ? ? ? random = (random + v/random) >> 1;
? ? ? ? ? ? i++;
? ? ? ? }
? ? ? ? System.out.println("開根號值: "+random+" ?,循環(huán)次數(shù): "+i);
? ? ? ? return random;
? ? }
? ? // 二分查找法
? ? public static double binarySearch(int v,double t){
? ? ? ? int i = 0;
? ? ? ? double max = v;
? ? ? ? double min = 0;
? ? ? ? double temp = v >> 1;
? ? ? ? while (abs(temp*temp-v) > t){
? ? ? ? ? ? if (temp*temp > v ){
? ? ? ? ? ? ? ? max = temp;
? ? ? ? ? ? } else if(temp*temp < v){
? ? ? ? ? ? ? ? min = temp;
? ? ? ? ? ? }
? ? ? ? ? ? temp = (min+max) >> 1;
? ? ? ? ? ? i++;
? ? ? ? }
? ? ? ? System.out.println("開根號值: "+temp+" ?,循環(huán)次數(shù): "+i);
? ? ? ? return temp;
? ? }
? ? public static double abs(double a){
? ? ? ? return (a <= 0.0D) ? 0.0D - a : a ;
? ? }
? ? public static void main(String[] args) {
? ? ? ? iter(100,0.1);
? ? ? ? System.out.println("-----------------");
? ? ? ? binarySearch(100,0.1);
? ? }
}結(jié)果如下:
開根號值: 31.638589750191308 ,循環(huán)次數(shù): 7
-----------------
開根號值: 31.63909912109375 ,循環(huán)次數(shù): 16
牛頓迭代法相比較二分查找法效率更高
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring?Boot?3中一套可以直接用于生產(chǎn)環(huán)境的Log4J2日志配置詳解
Log4J2是Apache Log4j的升級版,參考了logback的一些優(yōu)秀的設(shè)計,并且修復(fù)了一些問題,因此帶來了一些重大的提升,這篇文章主要介紹了Spring?Boot?3中一套可以直接用于生產(chǎn)環(huán)境的Log4J2日志配置,需要的朋友可以參考下2023-12-12
SpringBoot2 集成log4j2日志框架的實現(xiàn)
這篇文章主要介紹了SpringBoot2 集成log4j2日志框架的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
Java servlet通過事件驅(qū)動進行高性能長輪詢詳解
這篇文章主要介紹了基于servlet3.0+事件驅(qū)動實現(xiàn)高性能長輪詢的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2022-06-06
Spring lazy-init 懶加載的原理小結(jié)
lazy-init 是一個非常重要的屬性,可以優(yōu)化應(yīng)用的啟動時間,尤其是在處理大量bean或者復(fù)雜依賴關(guān)系時,可以顯著提高應(yīng)用的響應(yīng)速度,本文主要介紹了Spring lazy-init 懶加載的原理小結(jié),感興趣的可以了解一下2025-04-04

