开平方根算法

开方算法在语言的库函数里面都有,且会比下面讲到的快很多。

第一:二分查找法。

算法逻辑:

  1. 求x的开平方值。
  2. 判断x是否大于1,如果大于1,则最小值为1,最大值为x。
  3. 判断x是否小于1,如果小于1,则最小值为x,最大值为1。
  4. 求中值,计算中值的平方减去x 是否在误差允许范围内,如果是,则返回。
  5. 如果中值的平方大于x,则将估算最大值设置为中值。如果中值的平方小于x,则将估算最小值设置为x。
  6. 循环4-5步。

代码如下:

 1 double sqrt(double z)
 2 {
 3     double low =0;
 4     double high = 0;
 5     double x = 0;
 6     if(z==1)
 7     {
 8         x = 1;
 9         return x;
10     }
11     if(z<1)
12     {
13         low = z;
14         high = 1;
15     }
16     if(z>1)
17     {
18         low = 1;
19         high = z;
20     }
21     double eps = 0.0000001;
22     while(1)
23     {
24         double mid = (low+high)/2;
25         double tmp = mid*mid;
26         if(abs(tmp-z) < eps)
27         {
28             x = mid;
29             break;
30         }
31         if(tmp > z)
32         {
33             high = mid;
34         }else{
35             low = mid;
36         }
37     }
38     return x;
39 }

第二:牛顿迭代法

算法逻辑:

  1. 估算x的开方值g就等于x。
  2. 计算g的平方减去x 的值是否在误差范围内。
  3. 如果在,则返回g。
  4. 如果不在,则估算g的值为g=(g+z/g)/2。并重新执行第二步。直到计算结果符合误差要求。

代码如下:

 1 double sqrt_NewTon(double z)
 2 {
 3     double eps = 0.00001;
 4     double g = z;
 5     while(abs(g*g-z) > eps)
 6     {
 7         g = (g+z/g)/2;
 8     }
 9     return g;
10 }
时间: 2024-10-07 01:48:43

开平方根算法的相关文章

快速开平方根算法

人们很早就在Quake3源代码中发现了类似如下的C代码,它可以快速的求1/sqrt(x),在3D图形向量计算方面应用很广 float invSqrt(float x) { float xhalf = 0.5 * x; int i = *(int*)&x; // get bits for floating value i = 0x5f3759df - (i >> 1); // gives initial guess x = *(float*)&i; // convert bits

求立方根算法--个人对立方根算法的穷举和优化

在hpe实训中心学习,遇到了求立方根的题目,在此做一下算法笔记, 分析过程: 数n的立方根就是n=i*i**i;所以我们会优先想到一下方法. static double g32(double n){ //简易版 double i = 0, k = 0.0005f; if (n < 0) { //输入负数判断 k /= -1; } do{ i+=k; }while(abs(i*i*i)<abs(n)); //abs为自己写的求绝对值方法 return i; } 可以看出此方法的求解精度为0.00

SICP:求函数的不定点来实现开平方根(由于使用平均阻尼技术,过程类似牛顿开平方根,以及求黄金分割率)

#lang racket (define tolerance 0.00001);公差 (define (fixed-point f first-guess) (define (close-enough? v1 v2) (< (abs (- v1 v2)) tolerance) );close-enough? (define (try guess) (let ((next (f guess)));exp (if (close-enough? guess next) next (try next)

统计检验:为了使检验数据正态化,对granger指数 先开平方根 然后双样本T检验

实验组内 明显变化的边是  LBG-LPPC 可以这样解释吗:  基底神经节负责增强学习:基底神经节通过增加与皮层连接强度,负责增强学习 问题:与global network连接方向相反 但是文献中也提到不同任务  NETWORK是不同的 我觉得与global network连接方向相反 不是问题,老师觉得呢? 控制组内存在多条明显变化的边  :编号1和3 是小脑与大脑皮层之间的连接   方向相反 变化值一个变大一个变小  相互抵消   同理编号  4和5相互抵消 控制组内 明显变化的边是  2

原创:各种normalize函数实现的性能和精度大比拼

///////////////////////////////////////////////////////////////////////// // // Performance benchmarking program for various normalize functions // // by Elvic Liang // ///////////////////////////////////////////////// #include <math.h> #include <

如何学好算法和数据结构之我见——51CTO名家访谈实录

最近受邀参加"51CTO名家访谈"就算法与数据结构话题论道做答,希望这些问题能够解答各位读者朋友的心中疑惑. 活动网址如下: http://book.51cto.com/act/exp/zuofei 下面是活动中Q&A环节我的一些作答,希望可以作为正在学习算法的朋友们的一些经验参考. 算法到底是什么? 非形式地说,算法是为实现某个任务而构造的简单指令集.以日常用语来说,算法又称为 过程或者方法.算法在数学中也起着非常重要的作用.古代数学文献中就包含有执行各种各样计算任务的算法描

machine_learning-knn算法具体解释(近邻算法)

近邻算法是机器学习算法中的入门算法,该算法用于针对已有数据集对未知数据进行分类. 该算法核心思想是通过计算预測数据与已有数据的相似度猜測结果. 举例: 如果有例如以下一组数据(在下面我们统一把该数据作为训练数据): 身高 年龄 国籍 170 23 中国 180 21 美国 185 22 俄国 175 24 中国 120 23 日本 我们将该组数据的前两列作为一个特征值.最后一项作为一个待分类结果.当数据量足够大时,能够通过该数据便可得出较为精确的分类. 比如我们拿到測试数据.年龄23岁,身高17

LeetCode算法题-Sqrt(Java实现)

这是悦乐书的第158次更新,第160篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第17题(顺位题号是69). 计算并返回x的平方根,其中x保证为非负整数. 由于返回类型是整数,因此将截断十进制数字,并仅返回结果的整数部分.例如: 输入:4 输出:2 输入:8 输出:2 说明:8的平方根是2.82842 ...,从2以后小数部分被截断,返回2 本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试.

最基础的分类算法-k近邻算法 kNN简介及Jupyter基础实现及Python实现

k-Nearest Neighbors简介 对于该图来说,x轴对应的是肿瘤的大小,y轴对应的是时间,蓝色样本表示恶性肿瘤,红色样本表示良性肿瘤,我们先假设k=3,这个k先不考虑怎么得到,先假设这个k是通过程序员经验得到. 假设此时来了一个新的样本绿色,我们需要预测该样本的数据是良性还是恶性肿瘤.我们从训练样本中选择k=3个离新绿色样本最近的样本,以选取的样本点自己的结果进行投票,如图投票结果为蓝色:红色=3:0,所以预测绿色样本可能也是恶性肿瘤. 再比如 此时来了一个新样本,我们选取离该样本最近