代码改变世界

实现sqrt算法

  钟铧若岩  阅读(52)  评论(0编辑  收藏  举报

 

复制代码
 1 package com.company;
 2 
 3 
 4 import org.junit.Test;
 5 
 6 public class Lesson3_2 {
 7 
 8     /**
 9      * @Description: 计算大于1的正整数之*方根
10      * @param n-待求的数, deltaThreshold-误差的阈值, maxTry-二分查找的最大次数
11      * @return double-*方根的解
12      */
13     public static double getSqureRoot(int n, double deltaThreshold, int maxTry) {
14 
15         if (n <= 1) {
16             return -1.0;
17         }
18 
19         double min = 1.0, max = (double)n;
20         for (int i = 0; i < maxTry; i++) {
21             double middle = (min + max) / 2;
22             double square = middle * middle;
23             double delta = Math.abs((square / n) - 1);
24             if (delta <= deltaThreshold) {
25                 return middle;
26             } else {
27                 if (square > n) {
28                     max = middle;
29                 } else {
30                     min = middle;
31                 }
32             }
33         }
34 
35         return -2.0;
36 
37     }
38 
39     @Test
40     public  void Test1()
41     {
42         int number = 10;
43         double squareRoot = Lesson3_2.getSqureRoot(number, 0.000001, 10000);
44         if (squareRoot == -1.0) {
45             System.out.println("请输入大于1的整数");
46         } else if (squareRoot == -2.0) {
47             System.out.println("未能找到解");
48         } else {
49             System.out.println(String.format("%d的*方根是%f", number, squareRoot));
50         }
51     }
52 }
复制代码

 

 

1. 二分法

  • 原理 二分法基于这样一个事实:对于一个非负实数 \(x\),其*方根一定在区间 \([0, x]\)(当 \(x \geq 1\) 时)或者 \([x, 1]\)(当 \(0 < x < 1\) 时)内。通过不断将这个区间一分为二,然后判断中间值的*方与 \(x\) 的大小关系,逐步缩小包含*方根的区间范围,直到达到所需的精度。
  • 步骤
    • 确定初始区间 \([a, b]\):若 \(x \geq 1\),令 \(a = 0\),\(b = x\);若 \(0 < x < 1\),令 \(a = x\),\(b = 1\)。
    • 计算区间中点 \(mid=(a + b) / 2\)。
    • 比较 \(mid^2\) 与 \(x\) 的大小:
      • 如果 \(mid^2\) 约等于 \(x\)(在给定的误差范围内),则 \(mid\) 就是所求的*似*方根。
      • 如果 \(mid^2 > x\),说明*方根在区间 \([a, mid]\) 内,令 \(b = mid\)。
      • 如果 \(mid^2 < x\),说明*方根在区间 \([mid, b]\) 内,令 \(a = mid\)。
    • 重复上述步骤,直到满足精度要求。

 

相关博文:
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
历史上的今天:
2015-05-13 WINDOWS权限大牛们,请进
点击右上角即可分享
微信分享提示